能否使用零参数模板Lambda调用C++20的std::async?
问题解答:模板Lambda结合std::async的编译问题
你的代码里直接调用func.operator()<5>()能编译,但传给std::async失败,核心原因是模板Lambda的operator()是模板成员函数,直接传递func.operator()<5>的方式不符合std::async对可调用对象的要求:
func.operator()<5>()是直接调用该模板成员函数的实例,语法合法;- 但
func.operator()<5>本质是试图获取非静态成员函数的地址,这类函数调用时需要绑定所属对象,而std::async无法自动完成这个绑定,导致编译失败。
可行的解决方案
方案1:用Lambda包装调用逻辑
把模板Lambda的调用包装成一个普通Lambda,作为参数传给std::async:
#include <future> #include <array> int main() { auto func = []<int n>() { std::array<double, n> arr; }; func.operator()<5>(); // 用Lambda包装调用逻辑 std::async([]{ func.operator()<5>(); }); return 0; }
方案2:用std::bind绑定成员函数与对象
显式绑定模板成员函数的实例和func对象,生成可直接调用的包装器:
#include <future> #include <array> #include <functional> int main() { auto func = []<int n>() { std::array<double, n> arr; }; func.operator()<5>(); // 绑定成员函数与所属对象 std::async(std::bind(&decltype(func)::operator()<5>, func)); return 0; }
方案3:预生成绑定后的可调用对象
先把模板调用包装成独立的可调用对象,再传给std::async:
#include <future> #include <array> int main() { auto func = []<int n>() { std::array<double, n> arr; }; func.operator()<5>(); // 预生成可直接调用的对象 auto bound_call = []{ func.operator()<5>(); }; std::async(bound_call); return 0; }
这些方案的核心都是给std::async提供一个无需额外上下文即可调用的可调用对象,解决成员函数地址无法直接作为独立可调用实体的问题。
内容的提问来源于stack exchange,提问作者dp69
相关产品推荐
相关产品推荐

