gpt4 book ai didi

c++ - 尝试使用参数包绑定(bind) std::function 时获取未声明的参数

转载 作者:行者123 更新时间:2023-11-28 01:40:31 25 4
gpt4 key购买 nike

我正在尝试创建一个如下所示的可变参数模板类:

template <class... Args>
class Message
{
private:

std::function<void(Args...)> _function;
public:
//stuff

};

我想要一个绑定(bind)选项,这样用户就可以在需要时绑定(bind)任何函数(带有相应的参数)。我试过这种方法(这个函数是 Message 类的一部分,所以 Args... 来自类的模板参数):

    template<class T>
void Message::bindFunction(void(T::*function)(Args... args), T* ownerPtr)
{
//This doesn't work
_function = boost::bind(function,args, ownerPtr);
}

但是上面的方法不起作用,我尝试从绑定(bind)函数中的 args 创建元组,但编译器一直说:

<args_0> undeclared identifier.

(如果我传递更多参数,它会改变)

从用户的角度来看,它应该是这样的:

class Foo
{
public:

void test2(int a, float b, double c)
{
std::cout << "bla";
}
};

int main()
{
Foo f;

Message<int,float,double> Mess;

Mess.bindFunction(&Foo::test2, &f);
}

我看过很多关于转发参数的文章,但是大多数答案让我更加困惑,因为我已经有了不同的模板结构而没有解释它们。

最佳答案

使用 lambda 因为它们更好 ( Live Demo (C++11) ):

template<class T>
void bindFunction(void(T::*function)(Args...), T* ownerPtr)
{
_function = [function, ownerPtr](Args... args)
{
(ownerPtr->*function)(args...);
};
}

我们正在使用 [function, ownerPtr] 捕获函数指针和指向类实例的指针在 lambda 声明中。

lambda 接受参数列表,其类型在 Message 的可变参数模板中指定。类别:Args... args .

在内部,我们使用带有 (ownerPtr->*function) 的实例调用该函数语法,然后通过扩展参数包 (args...) 传入参数

要调用该函数,您可以这样写:

void callFunction(Args&&... args)
{
_function(std::forward<Args>(args)...);
}

我们使用 perfect forwarding将我们的论点传递给 std::function<void(Args...)>成员(member)。

关于c++ - 尝试使用参数包绑定(bind) std::function 时获取未声明的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336487/

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