检查类型是否与模板类型相同



我有一个用户定义的类

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";
}

现场演示

相关内容

  • 没有找到相关文章

最新更新