我想进行单元测试以检查(并了解函数解析的工作原理),对于某些数学函数中采用左值而不是原始类型的const左值引用的函数重载,正在调用好函数。我没有发现任何通常的模式。

struct A {/* ... */};

A f(A) {} // #1
A&& f(A&&) {} // #2
// Or some very complicated template overloading

int main() {
    f(A()); // call #2 ; How to get it ?
}

// I want to have:
// typeid(f).name();

是否可以在编译时从typeid(f)获取context? (例如gcc的抱怨)

“伪代码”:
std::cout << typeid(f with args A()).name() << std::endl
// >> "A&& f(A&&)"   (#2)

仅使用typeid(f),编译器(在Ubuntu x64上为gcc 7.3.0)
/home/xyzz/project/tests/RunTests.cpp:22: erreur : overloaded function with no contextual type information
     typeid(tst).name();
            ^~~

使用typeid(f()),它实际上返回返回类型

建议答案: std::result_of。模板参数不是重建的,但是我们可以得到函数类型。

最佳答案

以下内容似乎可以在我的机器上运行。它与您想要的距离有多近?

    std::cout
      << typeid( static_cast<void (*)(A)>(f) ).name() << std::endl;

关于c++ - 如何从调用表达式中获取函数的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54621906/

10-11 22:39
查看更多