【发布时间】:2010-10-26 14:20:13
【问题描述】:
我为一些选项声明了一个结构,这些选项应由命令行参数或通过读取输入文件来填充:
struct options {
int val1;
int val2;
bool val3;
}
现在我想在程序执行时检查正确数量的参数。当然是
const int optionsSize = 3;
会的。但是有什么自适应的方法吗?如果我在结构中添加另一个值并且不记得增加整数怎么办?
【问题讨论】:
标签: c++
我为一些选项声明了一个结构,这些选项应由命令行参数或通过读取输入文件来填充:
struct options {
int val1;
int val2;
bool val3;
}
现在我想在程序执行时检查正确数量的参数。当然是
const int optionsSize = 3;
会的。但是有什么自适应的方法吗?如果我在结构中添加另一个值并且不记得增加整数怎么办?
【问题讨论】:
标签: c++
为什么不将指定的选项添加到std::vector<string> options 并使用options.size() 方法检查正确的数字。然后将它们转换为正确的数据类型。
做这种事情的一种更强大的方法是使用Boost Program Options
【讨论】:
这需要反射,而 C++ 没有。
因此,在您的情况下,解析命令行、检查语法错误并在结构中设置请求值的代码还必须检查是否设置了足够的值。
【讨论】:
即使它不是最好的选择,从 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。
我不是所提供代码的作者。 对于任何感兴趣的人,这里有一些与该主题相关的更多链接:
【讨论】:
没有办法在语言内部计算这个数字。基本上,您唯一的选择是编写一个脚本来查看源代码。如果结构中的所有元素都具有相同的类型,则可以使用sizeof(thestruct)/sizeof(commontype)。
【讨论】:
“如果我在结构中添加另一个值并且不记得增加整数怎么办?”
如果没有检测到,那么单元测试是相当有缺陷的。
干杯,
【讨论】:
我不知道在运行时确定结构中成员数量的任何方法。你有两个选择:
【讨论】: