如何将容器或类似结构中可变数量的引用作为参数传递给函数

问题描述 投票:0回答:1

我想将对对象的可变数量的引用传递给 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}
    , 所有元素都有共同的祖先;
  • 元素不被复制,而是通过(常量)引用传递;
  • 迭代函数内的元素;

最简单、最优雅的方法是什么?

c++ reference arguments
1个回答
1
投票

我会使用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;
        }
    }() && ...);
}
© www.soinside.com 2019 - 2024. All rights reserved.