用于查找参数是否为类的不同模板语法

iam*_*ind 10 c++ templates metaprogramming

在阅读这个问题时,我偶然发现了@Johannes的回答.

template<typename> struct void_ { typedef void type; };

template<typename T, typename = void>  // Line 1
struct is_class { static bool const value = false; };

template<typename T>
struct is_class<T, typename void_<int T::*>::type> { // Line 2
  static bool const value = true; 
};
Run Code Online (Sandbox Code Playgroud)

此构造查找给定类型是否为类.令我困惑的是编写这个小元程序的新语法.任何人都可以详细解释:

  1. 为什么我们需要1号线?
  2. 第2行中语法<int T::*>作为template参数的含义是什么?

Xeo*_*Xeo 10

第1行:如果测试成功,则选择下面的部分特化.

第2行:int T::*T在类类型时有效,因为它表示成员指针.

这样,如果它是有效的,void_<T>::type产量void,具有这种部分特选择用于与实例化valuetrue.如果T是类类型的不是,那么这部分专门化出来的图片得益于SFINAE的,其默认值为回用的通用模板valuefalse.

每当你看到a T::SOMETHING,if SOMETHING不存在时,无论是类型,数据成员还是简单的指针定义,你都会得到SFINAE.

  • 为什么要通过`struct is_class <T,typename void_ <int T ::*> :: type>`(而不是更简单的`struct is_class <T,int T ::*>`)?(第二次编译但没有给出想要的结果) (2认同)
  • 为什么`void_ :: type`和`is_class`的第一个版本中的默认参数(即`typename = void`)需要相同? (2认同)