【发布时间】:2018-10-21 00:21:09
【问题描述】:
我有自己的线程实现,它允许我管理与我的线程通信的各种方式。它基于 C++ std::thread 类。
我创建线程来运行名为run() 的函数,该函数调用用户函数。我想做的是调用用户函数,包括我的线程对象指针。
构造函数中存在问题。我想传递构造函数中指定的Args 并将this 添加到该列表中:
class safe_thread
{
public:
typedef std::shared_ptr<safe_thread> pointer_t;
typedef std::vector<pointer_t> vector_t;
template<class Function, class... Args>
safe_thread(Function&& f, Args&&... args)
: f_function([this, f, args...]{ std::bind(f, this, args...)(); })
{
[...snip...]
private:
std::function<void()> f_function;
};
// I use that constructor with two different types of signatures:
//
// 1. member function
//
safe_thread listen(&my_other_class::some_function, this);
// 2. static function
//
safe_thread worker(&my_static_function);
std::bind() 不理解我当前的语法。它需要一个函数 (f) 和 args...。那么,我如何更改 args... 以包含 this?
【问题讨论】:
-
为什么在这里使用
bind?f(this, args...);完全有效。 -
此外,即使使用绑定,语法似乎也是正确的。你确定你传递了正确数量的参数吗?
-
@MilesBudnek,如果我用
std::bind()调用safe_thread因为我想调用一个成员函数,直接f(...)会失败并出现error: must use '.*' 或'->*' 在 'f (...)' 中调用指向成员函数的指针,例如'(... ->* f) (...)' -
所以
f是safe_thread的指向成员函数的指针(您试图将其绑定以传递this[asafe_thread*] 作为第一个参数)?这似乎不对。 -
如果
f是一个成员函数指针,其this已在args...中提供,则在args...之前注入不同的this将失败。基本上,上面的代码中有足够多的错误内容,并且(由您自己)对您需要 minimal reproducible example 的问题的误解。搞砸绑定或类似操作时出现的错误是不透明的,所以当你描述出了什么问题时,我只是不相信你。
标签: c++ arguments variadic-functions