C++14下std::result_of对lambda的使用限制及C++17代码迁移咨询
C17代码向下适配C14方案
完全可以在C++14标准下实现同等效果,无需引入std::function,也不会产生额外的闭包拷贝。
核心适配点
原C17代码仅使用了一个C17专属特性:std::invoke_result_t,替换为C++14支持的std::result_of_t即可,注意两者的参数语法存在差异,这也是你之前尝试失败的核心原因:
- C++17语法:
std::invoke_result_t<可调用类型, 参数类型...> - C++14语法:
std::result_of_t<可调用类型(参数类型...)>
完整可运行C++14适配代码
#include <iostream> #include <memory> #include <string> #include <type_traits> decltype(auto) fun_provider(std::string msg) { return [msg](){ std::cout << msg << std::endl; }; } int main() { auto fun = std::make_unique< std::result_of_t<decltype(fun_provider)(std::string)> >(fun_provider("Provided functor")); (*fun.get())(); } // 输出:Provided functor
效果说明
该实现和原C++17版本逻辑完全一致:
- 没有将闭包转换为
std::function,避免了类型擦除的额外开销 - 直接在堆上构造闭包对象,仅发生一次
std::string的移动/拷贝,和原版本行为完全相同 - 不需要硬编码闭包类型,完全依赖编译器推导类型
内容的提问来源于stack exchange,提问作者Maciej Bielski
相关产品推荐
相关产品推荐

