gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:16:18 24 4
gpt4 key购买 nike

如何从成员函数创建 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 行为。

最佳答案

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

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

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

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

Live Demo on Coliru

关于c++ - 将带有所有参数的成员函数传递给 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com