c – Variadic模板方法和std :: function – 编译错误
参见英文答案 >
C++11 does not deduce type when std::function or lambda functions are involved????????????????????????????????????2个
我确定这个错误非常简单而且很愚蠢,但是我看不到它.这是代码: #include <future> template <typename ResultType> class Foo { public: template <typename ...Args> void exec(const std::function<ResultType(Args...)>& task,Args&&... args) {} }; int main() { Foo<void>().exec([](){}); return 0; } 这是错误:
Foo< void>().exec< void>([](){})也不起作用(我更喜欢不必手动指定Args类型). 有关建议答案的更新:以下代码确实有效. 但这个问题真的没有解决方法吗?我可以以某种方式扩展我的模板以推断lambda参数吗? 解决方法
正如Pradhan所提到的,std :: function的确切类型无法从lambda中推断出来.您可以明确地强制转换它来解决问题:
Foo<void>().exec(std::function<void()>([](){})); 或者,您可以简单地为函数使用另一个类型名称,而无需创建std :: function: template <typename Callable,typename ...Args> void exec(Callable&& task,Args&&... args); 然后Callable将接受几种类型的函子,包括lambdas. 请注意,与模板解决方案相比,使用std :: function对象会有很小的性能损失. 您还可以添加一个static_assert以确保可以使用给定的参数调用Callable,否则显示有意义的消息,而不是让编译器在实际调用时生成一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |