我有一个用户定义的类
template<typename T, int N>
class MyClass
{
// Implementation
};
,我想检查另一个类的实例化,如果它的模板参数是MyClass
的实例template<typename T, std::enable_if_t<!is_MyClass<T>, bool> = true>
class MapClass
{
// custom stuff here
};
template<typename T, std::enable_if_t<is_MyClass<T>, bool> = true>
class MapClass
{
// Some more stuff here
};
我尝试像这样实现它,但是我的实例化失败了,因为它需要两个参数。如何自动提取两个参数
template <typename T> struct is_MyClass : std::false_type {};
template <typename T, int N> struct is_MyClass<MyClass<T, N>> : std::true_type {};
感谢我建议编写一个使用部分专门化的特性is_instantiation_of_myClass
:
template<typename T, int N>
class MyClass {};
template <typename C>
struct is_instantiation_of_myClass : std::false_type {};
template <typename T,int N>
struct is_instantiation_of_myClass<MyClass<T,N>> : std::true_type {};
template <typename C>
constexpr bool is_instantiation_of_myClass_v = is_instantiation_of_myClass<C>::value;
现在你可以基于is_instantiation_of_myClass<T>
做SFINAE或者只是简单的专门化:
template <typename T,bool = is_instantiation_of_myClass_v<T>>
struct Foo;
template <typename T>
struct Foo<T,true> {
static constexpr bool value = true;
};
template <typename T>
struct Foo<T,false> {
static constexpr bool value = false;
};
int main() {
std::cout << Foo< int >::value << "n";
std::cout << Foo< MyClass<int,42>>::value << "n";
}
现场演示