模板语法说明
Template syntax explanation
在一些资源上,我看到了一个代码:
struct C
{
template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type>
C(T&& f){}
}
我尽力了,但还是需要澄清。我知道SFINAE
习惯用法需要这个可怕的东西——如果某个东西失败了,模板化的函数就不会创建。这里我发现:
typename decay<T>::type
—这将从类型T
中删除cv限定符,或将数组T
转换为指针T
,或将T
转换为函数指针。但是这个typename
以前是什么?我想这与依赖类型有关,即提供的类型T
是另一个模板的一部分,对吧is_same<A, B>{}
-这个{}
牙套在这里做什么?为什么typename enable_if<A>::type
-正如我所理解的,如果A
为真,则存在type
字段,在这种情况下,它是void
,因为只有一个参数传递给enable_if
,对吧?但再说一遍,这个typename
以前是什么template <typename T, typename = typename A>
-这个typename = typename A
是什么?参数名称到底在哪里
- 是的,在这种情况下,typename关键字对编译器说decay::type实际上是类型(但不是
std::decay<T>
的静态变量) std::is_same
将运算符强制转换为bool,并通过{}创建该类型的对象,然后将其转换为bool(在编译时)。可供选择的变体是std::is_same<...>::value
- 如果
std::is_same
返回true,则std::enable_if
的成员类型存在,并且SFINAE可以通过该函数 - 该上下文中不需要参数名称(因为某个地方没有使用它)
p.S.std::enable_if
看起来像
template<bool B, class T = void> //(1)
struct enable_if {};
template<class T> /(2)
struct enable_if<true, T> { typedef T type; };
因此,如果第一个参数是false,则选择主模板(1),并且它没有类型成员,但如果是true特化(2),则选择
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 当使用通配符和null指针调用函数时,对输出的说明
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 关于C++中具有多重继承"this"指针的说明
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 16 位到 10 位转换代码说明
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 赋值到类型和空大括号. 语法说明
- c++模板语法说明
- 模板语法说明
- C++矩形类关于语法的说明
- 语法说明
- 运算符重载语法说明