重点:
1.类的函数判断方法
2.类中类型模板简化定义可以用来处理公共类的问题,比如A中有个类型叫做ATest,B中有个类型叫做BTest, 定义一个泛型类型Type代表ATest和BTest
using namespace std;
//处理类中是否存在给定名称的函数
#define HAS_MEMBER(member)\
template<typename T, typename... Args>struct has_member_##member\
{\
private:\
template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declval<Args>()...), std::true_type()); \
template<typename U> static auto Check(...) -> decltype(std::false_type()); \
public:\
static const bool value = std::is_same<decltype(Check<T>(0)), std::true_type>::value; \
}; \
class A
{
public:
using value_type = int;
public:
A()=default;
~A() = default;
A(int n) :num(n) {};
int Func()const { return num; };
private:
int num;
};
HAS_MEMBER(Func);//提前声明func函数
template<typename C>
struct ElementT
{
using Type = typename C::value_type;
};
template<typename T>
using ElementType = typename ElementT<T>::Type;
//采用enable_if_t 判断当前函数是否有func这个函数,没有就跳过
//enable_if_t<true/false,int>=0 其中 int和=0是默认操作
template<typename T, enable_if_t<has_member_Func<T>::value, int> = 0>
ElementType<T> sumOf(const T& num)
{
return num.Func();
}
int main()
{
A a(10);
std::cout << "value :"<< sumOf<A>(a);
return 0;
}
类中函数改成这样,实例化的时候会直接提示错误。
enable_if里面的内容问题: