具有两个参数的decltype,=decltype(a,b),用于函数返回类型
decltype with two parameters, = decltype(a,b), for function return type
我遇到了一个decltype()
,它有两个参数作为模板函数的返回值类型:
template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { }
有人知道第二个参数void()
是什么吗?非常感谢。
在表达式(void)(c.*f)(), void()
:中
-
(void)(c.*f)()
用于检查f
是c
中可以在没有参数的情况下调用的成员函数;无论如何,成员函数返回类型是什么并不重要,但它名义上被强制转换为void
-
如果以上内容有效,逗号运算符将丢弃它,并考虑第二部分,从而使整体效果符合
decltype(void())
,从而生成void
类型的
Praetorian在下面评论说,尾部的, void()
是多余的,因为前导部分无论如何都被转换为void
(C样式的(void)
)。。。我怀疑, void()
旨在作为文档,突出显示返回类型的类似enable_if
的条件选择,是否将其进一步缩短为decltype((c.*f)(), void())
是一种风格选择。
更多细节/示例
这可以用于SFINAE,尽管enable_if
更自我记录。考虑一下这段代码,以及main()
(CT代表编译时间)中的注释:
#include <iostream>
template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void())
{ std::cout << "member functionn"; }
template<class C>
void test(C c, int)
{ std::cout << "intn"; }
struct X {
int f() { return 42; }
double g(int) { return 3.14; }
};
int main()
{
X x;
test(x, &X::f); // ok - outputs "member functionn"
// test(x, &X::g); // CT error - g needs an argument
test(x, 99); // ok - outputs "intn"
}
输出:
member function
int
您可以在此处查看并运行代码。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- C++decltype和圆括号-为什么
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- decltype() 不适用于正在编译的类模板
- 可以用于获取参数类型的 decltype
- decltype用于递归变元函数模板的返回类型
- 具有两个参数的decltype,=decltype(a,b),用于函数返回类型
- decltype 不解析嵌套向量.如何将模板用于嵌套向量