如何检查对象是否是 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.

See it work in Compiler Explorer