尝试使用参数包绑定 std::function 时获取未声明的参数
Getting undeclared args when trying to bind std::function using parameter pack
我正在尝试创建一个看起来像这样的可变参数模板类:
template <class... Args>
class Message
{
private:
std::function<void(Args...)> _function;
public:
//stuff
};
我想要一个绑定选项,以便用户可以在需要时绑定任何函数(带有相应的参数(。我尝试过这种方法(这个函数是 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);
}
但是上述方法不起作用,我尝试从绑定函数中的参数创建元组,但编译器一直说:
<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,因为它们更好(现场演示 (C++11((:
template<class T>
void bindFunction(void(T::*function)(Args...), T* ownerPtr)
{
_function = [function, ownerPtr](Args... args)
{
(ownerPtr->*function)(args...);
};
}
我们正在捕获函数指针和指向类实例的指针,并在 lambda 声明中具有[function, ownerPtr]
。
lambda 接受参数列表,这些参数的类型在 Message
类的可变参数模板中指定:Args... args
。
在内部,我们使用具有(ownerPtr->*function)
语法的实例调用函数,然后通过展开参数包(args...)
传入参数
要调用该函数,您可以编写如下内容:
void callFunction(Args&&... args)
{
_function(std::forward<Args>(args)...);
}
我们使用完美转发将我们的参数传递给std::function<void(Args...)>
成员。
相关文章:
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 将函数参数"const char*"转换为"std::string_view"是
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::绑定错误参数可以成功?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- std::vector 没有重载函数的实例与参数列表匹配
- std::span<const T> 作为函数模板中的参数
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在构造函数中使用可变参数初始化 std::tuple
- 函数对象无法识别它获得的参数(std::set<int>)
- C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考
- std::move 或 std::forward 参数 std::unique_ptr&<T>&
- 错误:不允许使用"C++/ObjC++"使用无效参数"-std=gnu99"
- **编译器错误** - getline() 函数不接受第一个参数"std:ifstream"是什么我的问题?