ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Variadic模板方法和std :: function – 编译错误

2019-07-27 22:05:52  阅读:169  来源: 互联网

标签:c c11 templates variadic-templates


参见英文答案 > 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;
}

这是错误:

‘void CAsyncTask::exec(const std::function
&,Args &&…)’ : could not deduce template argument for ‘const
std::function &’ with [
ResultType=void ]

Foo< void>().exec< void>([](){})也不起作用(我更喜欢不必手动指定Args类型).

有关建议答案的更新:以下代码确实有效.
CAsyncTask< void>().exec(std :: function< void()>([](){}));

但这个问题真的没有解决方法吗?我可以以某种方式扩展我的模板以推断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,否则显示有意义的消息,而不是让编译器在实际调用时生成一个.

标签:c,c11,templates,variadic-templates
来源: https://codeday.me/bug/20190727/1558412.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有