c++ 如何将变量模板参数打包和解包到一个结构中?

fquxozlt  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(158)

假设 我 有 一 个 可变 参数 模板 , 它 可以 接受 许多 参数 , 并且 它 必须 将 它们 打包 , 以便 将 它们 提供 给 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 的 函数 的 ? 这个 方法 如何 知道 如何 解 包 ?
编辑 : 我 补充 了 更多 的 细节 问题 :

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
    1.这些 参数 是 如何 从 一 个 指针 扩展 为 传递 给 ProcessIntString 的 可变 数量 的 参数 的 ?
7gcisfzg

7gcisfzg1#

一个简单的方法就是把所有的类型都擦除。
例如,使用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

相关问题