【问题标题】:Take variable number of arguments and put them in std::vector获取可变数量的参数并将它们放入 std::vector
【发布时间】:2014-12-05 21:00:44
【问题描述】:

我正在创建一个类——我们称之为Container——它基本上只包含一个std::vector 和一些决定如何选择向量值的特殊逻辑。我想添加一种方法,通过一次调用向我的类添加多个值。这是我添加一项的方法:

void LoopGenerator::add(RandomStripe &stripe)
{
    stripes.push_back(new SingleStripe(stripe));
}

我想要一个类似的方法,可以这样调用:

LoopGenerator gen = LoopGenerator();
gen.add(RandomStripe(), RandomStripe(), RandomStripe() ... and as much as you want ... );

并将所有参数添加到内部std::vector

这可能只使用标准库,还是最好没有它们?

【问题讨论】:

  • 传统的 va_args 需要某种方式来知道传递了多少参数。或者,您可以使用可变参数模板(如果有)。
  • @Tomáš Zato RandomStripe 和 SingleStripe 是什么?它们是不同的类型吗?
  • @VladfromMoscow 是的,它们是不同的。实际上,SingleStripe 只是存在,所以RandomStripe 可以与数组以及其他条带生成类一起使用...SingleStripe 派生自与 LoopGenerator 相同的类。

标签: c++ vector overloading


【解决方案1】:

您可以使用 std::initializer_list。例如

#include <initializer_list>
#include <algorithm>
#include <vector>
#include <iterator>    


//...

void LoopGenerator::add( std::initializer_list<RandomStripe> stripe )
{
    std::transform( stripe.begin(), stripe.end(), 
                   std::back_inserter( stripes ),
                   []( const RandomStripe &s ) { return new SingleStripe( s ); } );
}

然后这样称呼它

gen.add( { RandomStripe(), RandomStripe(), RandomStripe(), /*...*/ } );

【讨论】:

  • 我正在重写代码,所以我花了一段时间才开始使用你的答案。我收到以下错误:cannot open source file "initializer_list" 我应该重新配置我的项目吗?
  • @Tomáš Zato 你用的是什么编译器?是否支持 C++ 2011?
  • Quick search 建议它没有。但我在 MS Visual Studio 工作。这是相当复杂和令人困惑的。也许它可以在某处启用。
  • @Tomáš Zato MS VS 的版本是多少?
【解决方案2】:

如果您有 C++11,则可以使用可变参数模板来完成此操作。

在以前的版本中,我建议只做方法链接:

LoopGenerator& LoopGenerator::add(RandomStripe &stripe)
{
    stripes.push_back(new SingleStripe(stripe));
    return *this;
}

并称它为gen.add(RandomStripe()).add(RandomStripe()).add(RandomStripe());

【讨论】:

  • 随着要添加到堆栈的元素数量的增加,用户是否应该更改代码以添加一个函数 add() 的调用?
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多