将带有所有参数的成员函数传递给std :: function

Wojtek

如何从成员函数创建std :: function而不需要键入std :: placeholders :: _ 1,std :: placeholders :: _ 2等,所以-我想“保留”所有参数,仅保存对象本身。

struct Foo{
  int bar(int,float,bool) {return 0;}
};
int baz(int,float,bool) {return 0;}
int main() {
  Foo object;
  std::function<int(int,float,bool)> fun1 = baz; // OK
  std::function<int(int,float,bool)> fun2 = std::bind(&Foo::bar, object); // WRONG, needs placeholders
}

我不想在此阶段提供参数,我只想将函数+对象存储在某个地方。例如,我想同时具有全局函数和成员函数的std :: vector。使用FastDelegate(fastdelegate::MakeDelegate(object, &Class::function)很容易

我不想使用lambda,因为它也需要我重新输入参数。我只想要旧的FastDelegate行为。

叶夫根尼(Evgeny Panasyuk)

您可以使用函数模板来推断所有成员函数参数类型,如下所示:

template<typename Obj, typename Result, typename ...Args>
auto make_delegate(const Obj &x, Result (Obj::*fun)(Args...)) -> // ...

并且将返回特殊的委托对象,该对象将包含您的对象(或指向它的指针),并将所有传递的参数转发给基础对象的成员函数:

template<typename Obj, typename Result, typename ...Args>
struct Delegate
{
    Obj x;
    Result (Obj::*f)(Args...);

    template<typename ...Ts>
    Result operator()(Ts&&... args)
    {
        return (x.*f)(forward<Ts>(args)...);
    }
};

您将获得以下用法语法:

function<int(int,float,bool)> fun = make_delegate(object, &Foo::bar);

这是完整的示例:

#include <functional>
#include <iostream>
#include <utility>

using namespace std;

struct Foo
{
    int bar(int x, float y, bool z)
    {
        cout << "bar: " << x << " " << y << " " << z << endl;
        return 0;
    }
};

int baz(int x, float y, bool z)
{
    cout << "baz: " << x << " " << y << " " << z << endl;
    return 0;
}

template<typename Obj, typename Result, typename ...Args>
struct Delegate
{
    Obj x;
    Result (Obj::*f)(Args...);

    template<typename ...Ts>
    Result operator()(Ts&&... args)
    {
        return (x.*f)(forward<Ts>(args)...);
    }
};

template<typename Obj, typename Result, typename ...Args>
auto make_delegate(const Obj &x, Result (Obj::*fun)(Args...))
    -> Delegate<Obj, Result, Args...>
{
    Delegate<Obj, Result, Args...> result{x, fun};
    return result;
}

int main()
{
    Foo object;
    function<int(int,float,bool)> fun[] =
    {
        baz,
        make_delegate(object, &Foo::bar) // <---- usage
    };
    for(auto &x : fun)
        x(1, 1.0, 1);
}

输出为:

baz: 1 1 1
bar: 1 1 1

在Coliru上进行现场演示

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将带有绑定成员函数的std :: bind对象传递给函数

来自分类Dev

将shared_ptr传递给std :: function(成员函数)

来自分类Dev

如何将成员函数指针传递给std :: function

来自分类Dev

将成员函数和 lambda 传递给 std::function

来自分类Dev

Python:将带有参数的函数传递给函数

来自分类Dev

Python:将带有参数的函数传递给函数

来自分类Dev

将带有参数的函数传递给事件处理程序

来自分类Dev

Bash:将带有引号的参数传递给函数

来自分类Dev

将lambda参数传递给没有中间变量的std :: function参数

来自分类Dev

将输入参数传递给lambda函数中的std :: function

来自分类Dev

将带有 ">=" 的参数传递给 argparse

来自分类Dev

创建std :: function,它返回带有函数成员值的variant。分段故障

来自分类Dev

为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

来自分类Dev

C ++在线程中传递带有自定义对象的std :: function作为参数

来自分类Dev

Boost C ++。将带有签名指针的成员函数指针传递给函数

来自分类Dev

如何将带有2个参数的函数作为参数传递给函数?

来自分类Dev

如何或可以将带有参数作为参数的函数传递给lua中的函数?

来自分类Dev

创建带有有限参数的std :: function类型

来自分类Dev

std :: function具有计时器C ++的成员函数

来自分类Dev

将带有空格和引号的参数传递给脚本(不引用所有内容)

来自分类Dev

如何将带有参数的参数传递给gulp?

来自分类Dev

如何在JavaScript中将带有参数的函数传递给函数

来自分类Dev

具有std :: function参数的函数不接受lamba函数

来自分类Dev

带有std :: function的开销

来自分类Dev

如何定义带有默认参数的std :: function变量?

来自分类Dev

将带有两个参数的函数传递给python中的filter()

来自分类Dev

将带有空格的数组传递给Bash函数以充当其参数列表

来自分类Dev

C-将带有参数的函数传递给包装执行器

来自分类Dev

C ++-错误地插入将带有const参数的函数指针传递给模板类

Related 相关文章

  1. 1

    将带有绑定成员函数的std :: bind对象传递给函数

  2. 2

    将shared_ptr传递给std :: function(成员函数)

  3. 3

    如何将成员函数指针传递给std :: function

  4. 4

    将成员函数和 lambda 传递给 std::function

  5. 5

    Python:将带有参数的函数传递给函数

  6. 6

    Python:将带有参数的函数传递给函数

  7. 7

    将带有参数的函数传递给事件处理程序

  8. 8

    Bash:将带有引号的参数传递给函数

  9. 9

    将lambda参数传递给没有中间变量的std :: function参数

  10. 10

    将输入参数传递给lambda函数中的std :: function

  11. 11

    将带有 ">=" 的参数传递给 argparse

  12. 12

    创建std :: function,它返回带有函数成员值的variant。分段故障

  13. 13

    为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

  14. 14

    C ++在线程中传递带有自定义对象的std :: function作为参数

  15. 15

    Boost C ++。将带有签名指针的成员函数指针传递给函数

  16. 16

    如何将带有2个参数的函数作为参数传递给函数?

  17. 17

    如何或可以将带有参数作为参数的函数传递给lua中的函数?

  18. 18

    创建带有有限参数的std :: function类型

  19. 19

    std :: function具有计时器C ++的成员函数

  20. 20

    将带有空格和引号的参数传递给脚本(不引用所有内容)

  21. 21

    如何将带有参数的参数传递给gulp?

  22. 22

    如何在JavaScript中将带有参数的函数传递给函数

  23. 23

    具有std :: function参数的函数不接受lamba函数

  24. 24

    带有std :: function的开销

  25. 25

    如何定义带有默认参数的std :: function变量?

  26. 26

    将带有两个参数的函数传递给python中的filter()

  27. 27

    将带有空格的数组传递给Bash函数以充当其参数列表

  28. 28

    C-将带有参数的函数传递给包装执行器

  29. 29

    C ++-错误地插入将带有const参数的函数指针传递给模板类

热门标签

归档