這是我正在使用的代碼
#include <functional>
#include <iostream>
#include <thread>
class Context {
private:
std::thread thread;
bool running;
void run() {
while (running) {
if (function != nullptr) {
function();
function = nullptr;
}
}
}
void (*function)();
public:
Context() : running(true) { thread = std::thread(&Context::run, this); }
~Context() {
running = false;
thread.join();
}
template <typename T, typename... Args> void call(T function, Args... args) {
this->function = std::bind(function, args...);
}
};
// Here are some test functions
void f1() { std::cout << "f1" << std::endl; }
void f2(int a) { std::cout << "f2(" << a << ")" << std::endl; }
void f3(int a, int b) {
std::cout << "f3(" << a << ", " << b << ")" << std::endl;
}
int main() {
Context context;
context.call(f1);
context.call(f2, 1);
context.call(f3, 1, 2);
return 0;
}
我希望這個類創建一個將運行一些函式的執行緒。執行緒將在創建類時創建,并在類銷毀時停止。為了運行函式,您可以使用要呼叫的函式和引數呼叫 Context::call 函式。
f2(2);
變成
context.call(f2, 2);
和
f3(3, 4);
變成
context.call(f3, 3, 4);
但是,當我嘗試編譯此檔案時出現錯誤:
t.cpp: In instantiation of 'void Context::call(T, Args ...) [with T = void (*)(); Args = {}]':
t.cpp:55:15: required from here
t.cpp:42:31: error: cannot convert 'std::_Bind_helper<false, void (*&)()>::type' to 'void (*)()' in assignment
42 | this->function = std::bind(function, args...);
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~
| |
| std::_Bind_helper<false, void (*&)()>::type
t.cpp: In instantiation of 'void Context::call(T, Args ...) [with T = void (*)(int); Args = {int}]':
t.cpp:56:15: required from here
t.cpp:42:20: error: cannot convert 'std::_Bind_helper<false, void (*&)(int), int&>::type' to 'void (*)()' in assignment
42 | this->function = std::bind(function, args...);
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.cpp: In instantiation of 'void Context::call(T, Args ...) [with T = void (*)(int, int); Args = {int, int}]':
t.cpp:57:15: required from here
t.cpp:42:20: error: cannot convert 'std::_Bind_helper<false, void (*&)(int, int), int&, int&>::type' to 'void (*)()' in assignment
我知道這段代碼不安全并且有缺陷,但我在實際實作中使用了互斥鎖和安全措施。此示例只是重現錯誤的最小示例。
uj5u.com熱心網友回復:
你可以利用std::function. 特別是,替換void (*function)()為std::function<void ()> function如下所示:
class Context {
private:
//other code here
std::function<void ()> function;
};
作業演示
uj5u.com熱心網友回復:
我會選擇其他方法。看一看:
#include <functional>
#include <iostream>
#include <thread>
using namespace std;
class Context
{
thread t;
public:
template<class Func, class... Args>
Context(Func func, const Args&... args) : t{ func, cref(args)... } {
}
~Context() {
if (t.joinable())
t.join();
}
};
void f1() {
cout << "f1" << endl;
}
void f2(int) {
cout << "f2" << endl;
}
void f3(int, int) {
cout << "f3" << endl;
}
int main()
{
Context c1{ f1 };
Context c2{ f2, 1 };
Context c3{ f3, 1, 2 };
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490208.html
