f
함수 멤버 getInt
가 아닌 모든 멤버에 대해 함수를 호출하려는 경우 함수에 대해 X
2 개의 오버로드를 선언 할 수 있습니다 f
.
getInt
클래스를 포함하여 멤버 함수 가있는 유형의 경우X
class를 포함한 다른 모든 유형의 경우 Y
.
C ++ 11 / C ++ 17 솔루션
이를 염두에두고 다음과 같이 할 수 있습니다.
#include <iostream>
#include <type_traits>
template <typename, typename = void>
struct has_getInt : std::false_type {};
template <typename T>
struct has_getInt<T, std::void_t<decltype(((T*)nullptr)->getInt())>> : std::is_convertible<decltype(((T*)nullptr)->getInt()), int>
{};
class X {
public:
int getInt(){
return 9;
}
};
class Y {};
template <typename T,
typename std::enable_if<!has_getInt<T>::value, T>::type* = nullptr>
void f(T& v) {
// only for Y
std::cout << "Y" << std::endl;
}
template <typename T,
typename std::enable_if<has_getInt<T>::value, T>::type* = nullptr>
void f(T& v){
// only for X
int i = v.getInt();
std::cout << "X" << std::endl;
}
int main() {
X x;
f(x);
Y y;
f(y);
}
실시간으로 확인하십시오 .
참고하시기 바랍니다 std::void_t
당신이 C ++ 11로 제한하는 경우 C ++ (17)에 도입되어 있지만은, 그것은 구현하기 정말 쉽게 void_t
자신에 :
template <typename...>
using void_t = void;
그리고 여기에 C ++ 11 버전이 있습니다 .
C ++ 20에는 무엇이 있습니까?
C ++ 20은 많은 장점을 제공하며 그중 하나는 개념 입니다. C ++ 11 / C ++ 14 / C ++ 17에 유효한 것은 C ++ 20에서 크게 줄일 수 있습니다.
#include <iostream>
#include <concepts>
template<typename T>
concept HasGetInt = requires (T& v) { { v.getInt() } -> std::convertible_to<int>; };
class X {
public:
int getInt(){
return 9;
}
};
class Y {};
template <typename T>
void f(T& v) {
// only for Y
std::cout << "Y" << std::endl;
}
template <HasGetInt T>
void f(T& v){
// only for X
int i = v.getInt();
std::cout << "X" << std::endl;
}
int main() {
X x;
f(x);
Y y;
f(y);
}
실시간으로 확인하십시오 .
type_info
구조에는 평등 비교 연산자 가 있으므로typeid(T) == typeid(X)
작동해야합니다.