[英]How to pack and unpack variadic template arguments into a structure?
假设我有一个可变参数模板,它可以接受许多参数并且它必须打包它们以便将它们提供给 C API。这可能作为缓冲区或 void* 传递,但随后作为 C++ 层反馈回调和 C++ 必须能够在运行时解压此结构并解释结果。 如何实现?
我认为我要问的最好的例子是 std::thread 如何打包参数并将它们提供给 CreateThread() ,然后 worker 方法如何能够以某种方式解包参数?
std::thread temp([](int i, std::string s) { std::cout << i << s;}, 1, "asd");
i
和s
参数是如何传递给 CreateThread 的 function 的,这个方法是如何知道如何解包的?
编辑:我正在为问题添加更多细节:
void CreateThread( void(void*) threadFunc, void* context);
void ProcessString(std::string s)
{
std::cout << s;
}
void ProcessIntString(int i, std::string s)
{
std::cout << i << " " << s;
}
std::thread sthread(ProcessString, "asd");
std::thread ithread(ProcessIntString, 3, "asd");
如您所见,只有一个 threadFunc,但它知道如何将void* context
解包为字符串或 {int, std::string}。 所以我的问题是:
int
+ string
?ProcessIntString
一个简单的方法就是擦除所有类型。
例如,使用std::function<void()>
void CreateThread(void(*f)(void*), void* arg){
f(arg);
}
// no forwarding for clarity
// parameters may be store inside the thread object
template <typename F,typename ...Args>
void InvokeInThread(F f,Args... args){
std::function<void()> invoker = std::bind_front(f,args...);
CreateThread(
+[](void* f){
reinterpret_cast<std::function<void()>*>(f)->operator()();
},
(void*)&invoker
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.