尝试使用参数包绑定 std::function 时获取未声明的参数
Getting undeclared args when trying to bind std::function using parameter pack
我正在尝试创建一个可变参数模板 class,如下所示:
template <class... Args>
class Message
{
private:
std::function<void(Args...)> _function;
public:
//stuff
};
我想要一个绑定选项,这样用户就可以在需要时绑定任何函数(带有相应的参数)。我试过这种方法(这个函数是 Message
class 的一部分,所以 Args...
来自 class 的模板参数:
template<class T>
void Message::bindFunction(void(T::*function)(Args... args), T* ownerPtr)
{
//This doesn't work
_function = boost::bind(function,args, ownerPtr);
}
但是上面的方法不起作用,我试图从绑定函数中的 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...);
};
}
我们在 lambda 声明中使用 [function, ownerPtr]
捕获函数指针和指向 class 实例的指针。
lambda 接受参数列表,其类型在 Message
class 的可变参数模板中指定:Args... args
。
在内部我们使用我们的实例以 (ownerPtr->*function)
语法调用函数,然后通过扩展参数包 (args...)
传入参数
要调用该函数,您可以这样写:
void callFunction(Args&&... args)
{
_function(std::forward<Args>(args)...);
}
我们使用 perfect forwarding 将参数传递给 std::function<void(Args...)>
成员。
我正在尝试创建一个可变参数模板 class,如下所示:
template <class... Args>
class Message
{
private:
std::function<void(Args...)> _function;
public:
//stuff
};
我想要一个绑定选项,这样用户就可以在需要时绑定任何函数(带有相应的参数)。我试过这种方法(这个函数是 Message
class 的一部分,所以 Args...
来自 class 的模板参数:
template<class T>
void Message::bindFunction(void(T::*function)(Args... args), T* ownerPtr)
{
//This doesn't work
_function = boost::bind(function,args, ownerPtr);
}
但是上面的方法不起作用,我试图从绑定函数中的 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...);
};
}
我们在 lambda 声明中使用 [function, ownerPtr]
捕获函数指针和指向 class 实例的指针。
lambda 接受参数列表,其类型在 Message
class 的可变参数模板中指定:Args... args
。
在内部我们使用我们的实例以 (ownerPtr->*function)
语法调用函数,然后通过扩展参数包 (args...)
要调用该函数,您可以这样写:
void callFunction(Args&&... args)
{
_function(std::forward<Args>(args)...);
}
我们使用 perfect forwarding 将参数传递给 std::function<void(Args...)>
成员。