C++ 模板语法解释
在某些资源上,我看到一个代码:C++ 模板语法解释,c++,templates,syntax,C++,Templates,Syntax,在某些资源上,我看到一个代码: struct C { template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type> C(T&& f){} } struct C { 模板{}>::类型> C(T&&f){} } 我尽了最大努力,但仍然需要一些澄清。我知道SFINAE习惯用法需要这个
struct C
{
template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type>
C(T&& f){}
}
struct C
{
模板{}>::类型>
C(T&&f){}
}
我尽了最大努力,但仍然需要一些澄清。我知道SFINAE
习惯用法需要这个可怕的东西——如果有什么东西失败了,模板函数就不会被创建。以下是我的发现:
typename decay::type
-这将从typeT
中删除cv限定符,或将数组T
转换为指针T
,或将T
转换为函数指针。但是这个typename
以前是什么?我想这与依赖类型有关,即提供的类型T
是另一个模板的一部分,对吗是否相同{}
-大括号在这里做什么?为什么?typename enable\u if::type
-据我所知,如果A
为true,则type
字段存在,在本例中为void
,因为只有一个参数被传递到enable\u if
,对吗?但是再说一遍,这个typename
以前是什么模板
-这是什么?争论的名字到底在哪里李>
std::decay
的静态变量)std::is_same
将运算符强制转换为bool,并通过{}创建该类型的对象,然后(在编译时)将其转换为bool。替代变量是std::is_same::value
std::is_same
返回true,则std::enable_的成员类型If
存在并且SFINAE可以通过该函数template<bool B, class T = void> //(1)
struct enable_if {};
template<class T> /(2)
struct enable_if<true, T> { typedef T type; };
模板//(1)
如果{},结构启用_;
模板/(2)
如果{typedef T type;},则结构启用_;
因此,如果第一个参数为false,则选择主模板(1),并且它没有类型成员,但如果为true,则选择专门化(2)