void_t
作用:就是判断类型能被生成
类似:enable_if
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Test
template <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Test
using type = _Ty;
};
template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
template <class... _Types>
using void_t = void;
#include <iostream>
#include <type_traits>
using namespace std;
struct MyStruct1
{
int name;
};
struct MyStruct2
{
int age;
};
namespace xxx
{
template <class... _Types>
using void_t = void;
template<class T, class = void>
struct typeStruct : false_type{};
template<class T>
struct typeStruct<T, void_t<decltype(T::name)>> : true_type{};
}
int main()
{
auto a = xxx::typeStruct<MyStruct1>::value;
auto b = xxx::typeStruct<MyStruct2>::value;
return 0;
}
template<class T, class = void>
struct typeStruct : false_type{};
template<class T>
struct typeStruct<T, void_t<decltype(T::name)>> : true_type{};
注意点:class必须是void类型,否则就需要显示调用。
xxx::typeStruct<MyStruct1, void>::value;
这个因为我之前说过的一个匹配机制。
模板层面先去匹配,然后才是特化层面
假设现在基类模板定义为template<class T, class = int>
xxx::typeStruct实际为xxx::typeStruct<MyStruct1,int>
直接不符合特化typeStruct<T, void>,因此直接会调用基类模板。
为了单参数下可以使用,参数必须默认时void