如何检查对象是否是 C++ 中多个模板参数的模板 class 的实例?
How to check if an object is an instance of a template class of multiple template arguments in C++?
我有以下 class:
template <typename T, typename U = UDefault>
class A;
如何检查 A<float>
或 A<float, int>
等类型是否是上述模板化 class 的实例?
我尝试将 修改为:
template <typename T, typename U>
struct IsA : std::false_type
{};
template <typename T, typename U>
struct IsA<A<T, U>> : std::true_type
{};
但出现以下错误
20:18: error: wrong number of template arguments (1, should be 2)
16:8: error: provided for 'template<class T, class U> struct IsA'
In function 'int main()':
40:34: error: wrong number of template arguments (1, should be 2)
16:8: error: provided for 'template<class T, class U> struct IsA'
如何解决?
您的 IsA
class 应该采用 one 模板参数。您正在测试的类型。
template <typename Type>
struct IsA : std::false_type {};
template <typename T, typename U>
struct IsA< A<T,U> > : std::true_type {};
// ^^^^^^ The specialization of your one template argument.
或者换句话说,因为 A 的各个模板参数在这里无关紧要:
template <typename ...AParams>
struct IsA< A<AParams...> > : std::true_type {};
// ^^^^^^^^^^^^^ The specialization of your one template argument.
我有以下 class:
template <typename T, typename U = UDefault>
class A;
如何检查 A<float>
或 A<float, int>
等类型是否是上述模板化 class 的实例?
我尝试将
template <typename T, typename U>
struct IsA : std::false_type
{};
template <typename T, typename U>
struct IsA<A<T, U>> : std::true_type
{};
但出现以下错误
20:18: error: wrong number of template arguments (1, should be 2)
16:8: error: provided for 'template<class T, class U> struct IsA'
In function 'int main()':
40:34: error: wrong number of template arguments (1, should be 2)
16:8: error: provided for 'template<class T, class U> struct IsA'
如何解决?
您的 IsA
class 应该采用 one 模板参数。您正在测试的类型。
template <typename Type>
struct IsA : std::false_type {};
template <typename T, typename U>
struct IsA< A<T,U> > : std::true_type {};
// ^^^^^^ The specialization of your one template argument.
或者换句话说,因为 A 的各个模板参数在这里无关紧要:
template <typename ...AParams>
struct IsA< A<AParams...> > : std::true_type {};
// ^^^^^^^^^^^^^ The specialization of your one template argument.