我想将对对象的可变数量的引用传递给 C++ 函数。比如说,我有类
ParameterBase
和从该基类派生的类的实例。我想要一个函数,它检查是否指定了所有参数。
//Abstract base class
class ParameterBase
{
public:
std::string name();
bool specified();
};
class ParameterInt : public ParameterBase
{
//whatever
};
class ParameterString : public ParameterBase
{
//whatever
};
/// Check that all parameters in the list are specified and
/// print the name of the first unspecified parameter.
bool all_specified(const magic_container<ParameterBase&>& parameters)
{
for(const auto& par : parameters)
{
if (!par.specified())
{
std::cerr << "Parameter '" << par.name() << "' was not specified\n";
return false;
}
}
return true;
}
int main()
{
ParameterInt n1, n2, n3;
ParameterString s1, s2, s3;
if (all_specified({n1, n2, s1, n3, s2, s3}))
{
std::cout << "Joy and happiness\n";
} else
{
std::cout << "Disaster\n";
}
return 0;
}
我明白,我可以使用指针容器或对象的引用包装器来解决这个问题,但我可能完全使用错误的方法吗?我想要的只是能够
{n1, n2, s1, n3, s2, s3}
,
所有元素都有共同的祖先;最简单、最优雅的方法是什么?
我会使用reference_wrapper或指针容器。
但作为替代方案,您可以使用 varaidic 模板:
template <typename... Ts>
bool all_specified(const Ts& parameters)
{
return ([&](){
if (!parameters.specified()) {
std::cerr << "Parameter '" << parameters.name() << "' was not specified\n";
return false;
} else {
return true;
}
}() && ...);
}