加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:58:13 所属栏目:百科 来源:网络整理
导读:参见英文答案 C++11 does not deduce type when std::function or lambda functions are involved????????????????????????????????????2个 我确定这个错误非常简单而且很愚蠢,但是我看不到它.这是代码: #include futuretemplate typename ResultTypeclass
参见英文答案 > 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,否则显示有意义的消息,而不是让编译器在实际调用时生成一个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读