如何获取结构中的元素数量?

时间:2010-10-26 14:20:13

标签: c++

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

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

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

const int optionsSize = 3;

会这样做。但有任何自适应方式吗?如果我在结构中添加另一个值并且不记得增加整数会怎么样?

6 个答案:

答案 0 :(得分:10)

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

更有效的方法是使用Boost Program Options

答案 1 :(得分:4)

这需要反思,C ++没有。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

如果没有检测到,那么单元测试相当不足。

干杯&amp;第h。,

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

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

对于C ++ 20,您可以使用require-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

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