如何修改含auto返回的std::function代码以兼容C++11编译?
问题描述
我正尝试让一个C14库在我们的C11代码库中运行,在使用std::function时遇到了问题(我对它了解甚少)。
极简代码如下:
#include <functional> #include <iostream> class A { public: A() {} ~A() {} using CallbackFn = std::function<int(int, double)>; auto GetCallbackFn() const { return mCallbackFcn.target<int (*)(int, double)>(); } private: CallbackFn mCallbackFcn; }; int main() { std::cout << "hi there\n"; }
该代码在C14下编译无错误,但在C11下会报错:
main.cpp:20:5: error: ‘GetCallbackFn’ function uses ‘auto’ type specifier without trailing return type
我尝试将auto替换为CallbackFn及其他组合,但均出现不同错误。请问如何修改代码使其能在C++11下编译?
解决方法
C++11不支持不带尾置返回类型的auto自动推导函数返回值,你需要明确写出GetCallbackFn的返回类型。
std::function::target<T>()的返回类型是T*,这里你指定的模板参数是int (*)(int, double)(指向int(int, double)类型函数的指针),所以返回类型是int (*)(int, double)*——也就是指向函数指针的指针。
推荐用类型别名简化写法,提升可读性:
#include <functional> #include <iostream> class A { public: A() {} ~A() {} using CallbackFn = std::function<int(int, double)>; // 定义函数指针类型的别名 using FuncPtr = int (*)(int, double); // 明确返回类型:指向FuncPtr的指针 FuncPtr* GetCallbackFn() const { return mCallbackFcn.target<FuncPtr>(); } private: CallbackFn mCallbackFcn; }; int main() { std::cout << "hi there\n"; }
如果不想用类型别名,也可以直接写出完整返回类型(可读性较差):
#include <functional> #include <iostream> class A { public: A() {} ~A() {} using CallbackFn = std::function<int(int, double)>; // 直接写出返回类型:指向函数指针的指针 int (*(*GetCallbackFn()) (int, double)) const { return mCallbackFcn.target<int (*)(int, double)>(); } private: CallbackFn mCallbackFcn; }; int main() { std::cout << "hi there\n"; }
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

