我为一些选项声明了一个结构,该结构应该由命令行参数或通过读取输入文件来填充:
struct options {
int val1;
int val2;
bool val3;
}
Run Code Online (Sandbox Code Playgroud)
现在我想在执行程序时检查正确的参数数量.当然可以
const int optionsSize = 3;
Run Code Online (Sandbox Code Playgroud)
会做.但有任何自适应方式吗?如果我在结构中添加另一个值并且不记得增加整数怎么办?
RC.*_*RC. 10
为什么不将指定的选项添加到a中std::vector<string> options并使用该options.size()方法检查正确的数字.然后将它们转换为正确的数据类型.
执行此类操作的更强大方法是使用Boost Program Options
即使这不是最好的选择,从 C++17 开始,我们可以进行模板元编程来获取“结构有多少个成员”的信息,只要结构是聚合的、非多态的,并且可以使用聚合初始化来初始化。
请注意,除非您使用了一些模板魔法,否则您不应该真正使用它。
在 C++17 中,它仍然存在很大问题,请参阅https://gist.github.com/ChemiaAion/4118a3598f0b120b7f9c5884e9799a8b。
在 C++20 中,您可以使用需要表达式来完成此操作:
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{});
}
Run Code Online (Sandbox Code Playgroud)
您可以查看这篇 Reddit 帖子来查看有关它的讨论。它的工作原理是尝试使用越来越多的参数实例化聚合初始化,如果失败,则意味着比当前实例化少一个成员:sizeof...(Members) - 1。
我不是所提供代码的作者。对于任何感兴趣的人,这里有一些与该主题相关的更多链接: