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

C++ 如何获取结构中的元素数?,c++,C++,我为一些选项声明了一个结构,这些选项应通过命令行参数或读取输入文件来填充: struct options { int val1; int val2; bool val3; } 现在我想检查程序执行时参数的正确数量。当然可以 const int optionsSize = 3; 可以。但是有什么适应的方法吗?如果我在结构中添加另一个值,但不记得增加整数,该怎么办?为什么不将指定的选项添加到std::vector options中,并使用options.size()方法检查正确的数字

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

struct options {
  int val1;
  int val2;
  bool val3;
}
现在我想检查程序执行时参数的正确数量。当然可以

const int optionsSize = 3;

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

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


做这类事情的一种更可靠的方法是使用

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

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

  • 使用助推聚变序列,但这是过度杀戮
  • 使用boost program_选项,在这里我相信您可以为每个选项指定它是否应该是强制性的。这将自动为您检查(在解析命令行时)。因此,您需要记住的就是将struct成员添加到program_选项的选项集中。文档中有很多示例,询问您是否有任何问题

  • 这需要反射,C++没有。p> 因此,在您的情况下,解析命令行、检查语法错误以及在结构中设置请求值的代码还必须检查是否设置了足够的值

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

    如果单元测试没有检测到这一点,那么它就有相当大的缺陷


    Cheers&hth.,

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

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

    在C++17中,它仍然存在相当大的问题,请参见

    使用C++20,您可以使用requires表达式:

    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{});
    }
    
    struct UniversalType{
    模板
    运算符T(){}
    };
    模板
    consteval自动成员计数器(自动…成员){
    if constexpr(需要{T{Members…};}==false)
    返回大小…(成员)-1;
    其他的
    返回MemberCounter(成员…,UniversalType{});
    }
    
    你可以看看关于它的讨论。 它通过尝试用越来越多的参数实例化聚合初始化来工作,如果失败,则意味着比当前实例化少了一个成员:
    sizeof…(Members)-1

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


    感谢您通过boost提供解决方案并指出替代方案!