具有两个参数的decltype,=decltype(a,b),用于函数返回类型

decltype with two parameters, = decltype(a,b), for function return type

本文关键字:decltype 用于 返回类型 函数 两个 参数      更新时间:2023-10-16

我遇到了一个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)()用于检查fc中可以在没有参数的情况下调用的成员函数;无论如何,成员函数返回类型是什么并不重要,但它名义上被强制转换为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

您可以在此处查看并运行代码。