如何检查模板参数是否为 struct/class?

How to check if a template parameter is a struct/class?

对于这样的小例子,如果 Tstruct/class,我只想接受 T 并拒绝内置类型,如 'int'、'char', 'bool'等

template<typename T>
struct MyStruct
{
   T t;
};

您正在寻找 std::is_class traits from <type_traits> header。哪个

Checks whether T is a non-union class type. Provides the member constant value which is equal to true, if T is a class type (but not union). Otherwise, value is equal to false.


例如,对于模板类型 T,您可以 static_assert 如下所示:

#include <type_traits> // std::is_class

template<typename T>
struct MyStruct
{
   static_assert(std::is_class<T>::value, " T must be struct/class type!");
   T t;
};

(See a demo)


concept 更新

在 C++20 中,也可以使用 std::is_class 提供一个概念,如下所示。

#include <type_traits> // std::is_class

template <class T> // concept
concept is_class = std::is_class<T>::value;

template<is_class T> // use the concept
struct MyStruct
{
   T t;
};

(See a demo)