std::invoke不支持变参模板成员函数吗?
问题原因
funcn是变参成员函数模板,你直接写&Thing::funcn时,编译器没有足够信息推导该模板的实参,无法生成对应的函数实例,也就没法确定要传给std::invoke的可调用对象类型,直接触发模板推导失败的报错。
解决方法
有两种常用的改法:
方法1:显式指定funcn的模板参数完成实例化
取函数地址时直接指定模板参数,让编译器先生成对应函数实例:
std::invoke( &Thing::funcn<int, int, int, int>, thing, 1, 2, 3, 4 );
如果不想手动写参数类型,也可以用decltype配合参数自动推导:
std::invoke( &Thing::funcn<decltype(1), decltype(2), decltype(3), decltype(4)>, thing, 1, 2, 3, 4 );
方法2:用lambda包装变参模板调用
如果不想显式写模板参数,更灵活的方式是用无捕获lambda封装调用逻辑,lambda内部可以自动完成模板推导:
std::invoke( [](auto&& obj, auto&&... args) { return obj.funcn(std::forward<decltype(args)>(args)...); }, thing, 1, 2, 3, 4 );
这种写法不需要手动指定模板参数,参数个数、类型变化时也不用修改代码,适配性更好。
如果需要配合std::apply使用,也可以参考lambda包装的方案:
auto args_tuple = std::make_tuple(1, 2, 3, 4); std::apply( [&](auto&&... unpacked_args) { return thing.funcn(std::forward<decltype(unpacked_args)>(unpacked_args)...); }, args_tuple );
内容的提问来源于stack exchange,提问作者user5406764
相关产品推荐
相关产品推荐

