如何检查一个对象是否是多个模板参数的模板 class 的实例,以及其中一个参数是否满足某些条件?
How to check if an object is an instance of template class of multiple template arguments and that one of said arguments fulfills some condition?
从 我得到了以下特征来检查一个类型是否是几个模板参数的模板化类型的特定模板实例化:
template <typename T1, typename T2>
struct A
{
};
template <typename Type>
struct IsA: std::false_type
{
};
template <typename T1, typename T2>
struct IsA<A<T1, T2>> : std::true_type
{
};
如何额外添加第二种T2
满足其他条件的条件?
我试过
template <typename Type>
struct IsA: std::false_type
{
};
template <typename T1, typename T2, std::enable_if_t<SomeCondition<T2>::value>>
struct IsA<A<T1, T2>> : std::true_type
{
};
但收到错误
error: template parameters not deducible in partial specialization:
你走在正确的轨道上:
#include <type_traits>
#include <iostream>
template <typename T1, typename T2>
struct A
{
};
template <typename Type, typename=void>
struct IsA: std::false_type
{
};
template <typename T1, typename T2>
struct IsA<A<T1, T2>, std::enable_if_t<std::is_same_v<T2, int>>>
: std::true_type
{
};
int main()
{
std::cout << IsA<int>::value << "\n";
std::cout << IsA<A<char, char>>::value << "\n";
std::cout << IsA<A<char, int>>::value << "\n";
return 0;
}
在这个简单的例子中,“某些条件”只是一个 std::is_same_v<T2, int>
,只是为了举例。
从
template <typename T1, typename T2>
struct A
{
};
template <typename Type>
struct IsA: std::false_type
{
};
template <typename T1, typename T2>
struct IsA<A<T1, T2>> : std::true_type
{
};
如何额外添加第二种T2
满足其他条件的条件?
我试过
template <typename Type>
struct IsA: std::false_type
{
};
template <typename T1, typename T2, std::enable_if_t<SomeCondition<T2>::value>>
struct IsA<A<T1, T2>> : std::true_type
{
};
但收到错误
error: template parameters not deducible in partial specialization:
你走在正确的轨道上:
#include <type_traits>
#include <iostream>
template <typename T1, typename T2>
struct A
{
};
template <typename Type, typename=void>
struct IsA: std::false_type
{
};
template <typename T1, typename T2>
struct IsA<A<T1, T2>, std::enable_if_t<std::is_same_v<T2, int>>>
: std::true_type
{
};
int main()
{
std::cout << IsA<int>::value << "\n";
std::cout << IsA<A<char, char>>::value << "\n";
std::cout << IsA<A<char, int>>::value << "\n";
return 0;
}
在这个简单的例子中,“某些条件”只是一个 std::is_same_v<T2, int>
,只是为了举例。