Cur*_*ous 3 c++ templates function-pointers function c++11
参考以下代码
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
void function() {
cout << "Hello World" << endl;
}
int main() {
vector<void (*) ()> functions;
functions.push_back(function); // (1) no error
functions.push_back(&function); // (2) no error
for (const auto& func : functions) {
func();
}
// vector<decltype(function)> vec; // (3) error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我取消注释时,似乎有一个错误(3),我只是想了解这背后的原因.当我将函数作为参数传递给模板化函数时,它是否将类型解析为函数指针?编译器将所有函数类型推断为函数指针是有意义的,但为什么decltype()不能解析为函数指针?
decltype(function)是void()- 一个功能.
你需要的是一个函数的衰变版本 - void(*)():
std::decay<decltype(function)>::type
std::vector < std::decay<decltype(function)>::type > myPtrFunctionVec;
Run Code Online (Sandbox Code Playgroud)
PS.
如果你正在使用VC++(visual stdio),你可以很容易地看到decltype通过打印推断出的类型typeid(decltype(XXX)).name().与其他编译器不同,VC++给出了未修饰的类型名称.非常方便的元编程调试.
编辑:
正如@Daniel Jour评论的那样,解决方案decltype(&function)也可以工作,因为构造&f提供指针f,这就是你需要的