如何检查模板参数是否是结构/类?

A. *_* K. 6 c++ templates class-template c++11 c++14

对于这样的一个小例子,我只想接受Tif Tis astruct/class并拒绝内置类型,如“int”、“char”、“bool”等。

template<typename T>
struct MyStruct
{
   T t;
};
Run Code Online (Sandbox Code Playgroud)

JeJ*_*eJo 12

您正在std::is_class<type_traits>标题中寻找特征。哪一个

检查是否T是非联合类类型。true如果T是类类型(但不是联合),则提供等于,的成员常量值。否则,值等于false


例如,您可以static_assert为模板类型T如下:

#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;
};
Run Code Online (Sandbox Code Playgroud)

见演示


概念更新

在 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;
};
Run Code Online (Sandbox Code Playgroud)

见演示