迭代打包的可变参数模板参数列表
在 C 中,迭代打包的可变参数模板参数列表会带来特定的挑战,因为缺乏编译时反射能力。然而,有一些技术可以让我们解决这个任务。
理解问题
目标是迭代一组模板参数,提取特定的数据类型(例如 int、char*、float)并将其存储在单独的向量中。此外,还需要一个向量来跟踪参数出现的顺序。
接近解决方案
在 Lambda 中使用折叠表达式:
对于混合类型输入,C 17 折叠表达式可以与 lambda 表达式一起使用。 lambda 封装了循环行为,递增计数器并打印每个输入的值及其位置。
<code class="cpp">template<class ... Ts> void Foo(Ts && ... inputs) { int i = 0; ([&]() { ++i; std::cout << "input " << i << " = " << inputs << std::endl; }(), ...); }
处理 Return/Break 语句:
如果 return 或循环内需要使用break语句,可以实现解决方法:
自定义宏方法:
另一种方法涉及创建一个自定义宏来构造一个类型保存所有参数,然后将其展开到向量内。虽然这是一个非标准方法,但它可以实现所需的功能。
<code class="cpp">struct any { void do_i(int e) { INT = e; } void do_f(float e) { FLOAT = e; } void do_s(char* e) { STRING = e; } int INT; float FLOAT; char* STRING; }; #define def(name) \ template<typename... T> \ auto name(T... argv) -> any { \ std::initializer_list<any> argin = { argv... }; \ std::vector<any> args = argin; #define get(name, T) get<T>()(args[name]) #define end }</code>
此方法需要手动调用 arg() 函数为每个参数创建一个 any 实例。
结论
迭代 C 中的打包可变参数模板参数列表需要创新的解决方案。这里讨论的方法解决了这一挑战,允许有效处理混合类型参数,同时保持可移植性和跨平台兼容性。
以上是如何在 C 中迭代打包的可变参数模板参数列表?的详细内容。更多信息请关注PHP中文网其他相关文章!