繁体   English   中英

如何将可变参数模板 arguments 打包和解包到结构中?

[英]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");

is参数是如何传递给 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}。 所以我的问题是:

  1. std::thread 如何将所有参数打包到那个 void* 中?
  2. threadFunc 方法如何知道如何将这些参数扩展为字符串,或者可能是int + string
  3. 这些参数如何从一个指针扩展为可变数量的 arguments,即传递给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
    );
}

https://godbolt.org/z/qhWa4TM5c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM