假设 我 有 一 个 可变 参数 模板 , 它 可以 接受 许多 参数 , 并且 它 必须 将 它们 打包 , 以便 将 它们 提供 给 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 的 函数 的 ? 这个 方法 如何 知道 如何 解 包 ?
编辑 : 我 补充 了 更多 的 细节 问题 :
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} 。 因此 , 我 的 问题 是 :
- std : : thread 如何 将 所有 参数 打包 到 void * 中 ?
- threadFunc 方法 如何 知道 如何 将 这些 参数 扩展 为 字符 串 , 或者 可能 是
int
+string
?
1.这些 参数 是 如何 从 一 个 指针 扩展 为 传递 给ProcessIntString
的 可变 数量 的 参数 的 ?
1条答案
按热度按时间7gcisfzg1#
一个简单的方法就是把所有的类型都擦除。
例如,使用
std::function<void()>
https://godbolt.org/z/qhWa4TM5c