首页 > 后端开发 > C++ > 如何在 C 中迭代打包的可变参数模板参数列表?

如何在 C 中迭代打包的可变参数模板参数列表?

Susan Sarandon
发布: 2024-10-23 18:09:02
原创
541 人浏览过

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

迭代打包的可变参数模板参数列表

在 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语句,可以实现解决方法:

  • 使用Try/Throw:抛出异常来退出循环。 注意: 这种方法会显着降低函数速度。
  • 变量/If 开关: 使用由代表每种类型的变量控制的 switch 语句。这并不理想,但可以处理 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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板