可变参数模板函数接受lambda

订婚

我正在尝试理解下面的代码所引起的编译器错误。我有一个可变参数的模板函数,该函数接受具有指定类型的lambda,并且尝试调用该函数会导致由于不匹配而导致模板不被视为有效候选者。

#include <functional>

template<typename ... ResultTypes>
void executeWithResultHandler(std::function<void (ResultTypes...)> lambda)
{
}

int main(int argc, char **argv)
{
    executeWithResultHandler<int>([] (int arg) {
    });
    return 0;
}

这将导致以下错误:

$ c++ -std=c++11 reduction.cpp 
reduction.cpp:10:5: error: no matching function for call to 'executeWithResultHandler'
    executeWithResultHandler<int>([] (int arg) {
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
reduction.cpp:4:6: note: candidate template ignored: could not match 'function<void (int, type-parameter-0-0...)>' against
      '<lambda at reduction.cpp:10:35>'
void executeWithResultHandler(std::function<void (ResultTypes...)> lambda)
     ^
1 error generated.

如果我将声明更改为可变参数:

template<typename ResultType>
void executeWithResultHandler(std::function<void (ResultType)> lambda)
{
}

那么它适用于上面的玩具示例,但是对于真正的问题,我需要任意参数。有什么我想念的东西吗?

编辑:这被错误地标记为重复项,我相信-欺骗并不能回答我所问的问题。这个问题特别与此处可变参数模板问题有关:请注意,当我将模板切换为非可变时,lambda会按预期正确地转换为std :: function类型。不管参数有多少,这都是正确的,只要不以可变方式处理即可。

但是,它并没有使用专门的可变参数版本,尽管工作的期望,参数包解压后是一组真实参数,并在模板参数列表中的函数调用网站的明确规范。

丹尼尔·弗雷(Daniel Frey)

在您的情况下,可变参数模板的问题在于,编译器不知道int您显式指定的对象是否是其完整列表ResultTypes...,因此它将尝试从您提供给它的参数中推断出可选的剩余参数,这显然会失败。这是可变参数模板参数的常见陷阱,不仅限于lambda。

一个解决方案总是意味着您从编译器中取消了此选项,例如

template<typename ... ResultTypes>
void executeWithResultHandler_impl(std::function<void (ResultTypes...)> lambda)
{
}

template<typename ... ResultTypes, typename F>
void executeWithResultHandler(F&& lambda)
{
    executeWithResultHandler_impl(std::function<void (ResultTypes...)>(lambda));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

方法接受函数指针的可变参数模板

来自分类Dev

接受括号构造对象的可变参数模板列表的函数

来自分类Dev

是否可以从函数模板返回可变参数的lambda?

来自分类Dev

是否可以从函数模板返回可变参数的lambda?

来自分类Dev

可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

来自分类Dev

可变参数lambda vs可变参数模板函数:完全等效吗?

来自分类Dev

递归可变参数函数模板

来自分类Dev

编写可变参数模板构造函数

来自分类Dev

类型受限的可变参数模板函数

来自分类Dev

如何传递可变参数模板函数?

来自分类Dev

如何重载可变参数模板函数?

来自分类Dev

可变参数模板函数重载失败

来自分类Dev

可变参数模板中的函数顺序

来自分类Dev

在构造函数中限制可变参数模板的可接受方法

来自分类Dev

将可变参数模板参数传递给可变函数

来自分类Dev

可变参数函数和可变参数模板重载查找

来自分类Dev

可变参数模板类-可变参数成员函数

来自分类Dev

可变参数模板对

来自分类Dev

没有模板参数的可变参数模板函数

来自分类Dev

使用可变参数模板参数解析lambda签名

来自分类Dev

让需要单个模板参数的模板模板参数的类接受可变参数模板参数的模板模板参数?

来自分类Dev

以成员函数指针为参数的可变参数模板

来自分类Dev

具有可变参数模板参数的函数指针

来自分类Dev

可变参数模板,获取函数参数值

来自分类Dev

可变参数模板类中的派生(虚拟)函数参数

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

是否可以修复可变参数模板函数的参数?

来自分类Dev

完美转发可变参数模板参数到成员函数

Related 相关文章

  1. 1

    可变参数模板函数接受lambda

  2. 2

    方法接受函数指针的可变参数模板

  3. 3

    接受括号构造对象的可变参数模板列表的函数

  4. 4

    是否可以从函数模板返回可变参数的lambda?

  5. 5

    是否可以从函数模板返回可变参数的lambda?

  6. 6

    可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

  7. 7

    可变参数lambda vs可变参数模板函数:完全等效吗?

  8. 8

    递归可变参数函数模板

  9. 9

    编写可变参数模板构造函数

  10. 10

    类型受限的可变参数模板函数

  11. 11

    如何传递可变参数模板函数?

  12. 12

    如何重载可变参数模板函数?

  13. 13

    可变参数模板函数重载失败

  14. 14

    可变参数模板中的函数顺序

  15. 15

    在构造函数中限制可变参数模板的可接受方法

  16. 16

    将可变参数模板参数传递给可变函数

  17. 17

    可变参数函数和可变参数模板重载查找

  18. 18

    可变参数模板类-可变参数成员函数

  19. 19

    可变参数模板对

  20. 20

    没有模板参数的可变参数模板函数

  21. 21

    使用可变参数模板参数解析lambda签名

  22. 22

    让需要单个模板参数的模板模板参数的类接受可变参数模板参数的模板模板参数?

  23. 23

    以成员函数指针为参数的可变参数模板

  24. 24

    具有可变参数模板参数的函数指针

  25. 25

    可变参数模板,获取函数参数值

  26. 26

    可变参数模板类中的派生(虚拟)函数参数

  27. 27

    C ++中没有参数可变参数模板函数

  28. 28

    是否可以修复可变参数模板函数的参数?

  29. 29

    完美转发可变参数模板参数到成员函数

热门标签

归档