【问题标题】:How to get the number of elements in a struct?如何获取结构中元素的数量?
【发布时间】:2010-10-26 14:20:13
【问题描述】:

我为一些选项声明了一个结构,这些选项应由命令行参数或通过读取输入文件来填充:

struct options {
  int val1;
  int val2;
  bool val3;
}

现在我想在程序执行时检查正确数量的参数。当然是

const int optionsSize = 3;

会的。但是有什么自适应的方法吗?如果我在结构中添加另一个值并且不记得增加整数怎么办?

【问题讨论】:

    标签: c++


    【解决方案1】:

    为什么不将指定的选项添加到std::vector<string> options 并使用options.size() 方法检查正确的数字。然后将它们转换为正确的数据类型。

    做这种事情的一种更强大的方法是使用Boost Program Options

    【讨论】:

    • 感谢您提供解决方案并通过 boost 指出替代方案!
    【解决方案2】:

    这需要反射,而 C++ 没有。

    因此,在您的情况下,解析命令行、检查语法错误并在结构中设置请求值的代码还必须检查是否设置了足够的值。

    【讨论】:

      【解决方案3】:

      即使它不是最好的选择,从 C++17 开始,我们可以进行模板元编程来获取“结构有多少成员”的信息,只要结构是聚合的,非多态,可以使用aggregate initialization初始化。

      请注意,除非您使用模板魔法,否则您不应该真正使用它。

      在 C++17 中仍然存在很大问题,请参阅 https://gist.github.com/ChemiaAion/4118a3598f0b120b7f9c5884e9799a8b

      在 C++20 中,您可以使用 requires-expression:

      struct UniversalType {
          template<typename T>
          operator T() {}
      };
      
      template<typename T>
      consteval auto MemberCounter(auto ...Members) {
          if constexpr (requires { T{ Members... }; } == false)
              return sizeof...(Members) - 1;
          else
              return MemberCounter<T>(Members..., UniversalType{});
      }
      

      您可以查看this Reddit post 以查看有关它的讨论。 它通过尝试使用越来越多的参数来实例化聚合初始化来工作,如果失败,则意味着比当前实例化少一个成员:sizeof...(Members) - 1

      我不是所提供代码的作者。 对于任何感兴趣的人,这里有一些与该主题相关的更多链接:

      【讨论】:

        【解决方案4】:

        没有办法在语言内部计算这个数字。基本上,您唯一的选择是编写一个脚本来查看源代码。如果结构中的所有元素都具有相同的类型,则可以使用sizeof(thestruct)/sizeof(commontype)

        【讨论】:

          【解决方案5】:

          “如果我在结构中添加另一个值并且不记得增加整数怎么办?”

          如果没有检测到,那么单元测试是相当有缺陷的。

          干杯,

          【讨论】:

            【解决方案6】:

            我不知道在运行时确定结构中成员数量的任何方法。你有两个选择:

            1. 使用增强融合序列,但这有点过头了
            2. 使用 boost program_options,我相信您可以在这里为每个选项指定它是否应该是强制性的。这将自动为您检查(在解析命令行时)。因此,您需要记住的只是将 struct 成员添加到 program_options 的选项集中。文档中有很多例子,有什么问题可以问...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-01-07
              • 1970-01-01
              • 1970-01-01
              • 2020-01-25
              • 1970-01-01
              相关资源
              最近更新 更多