C++ 获取可变数量的参数并将它们放入std::vector中
我正在创建一个类,我们称之为C++ 获取可变数量的参数并将它们放入std::vector中,c++,vector,overloading,C++,Vector,Overloading,我正在创建一个类,我们称之为容器,它基本上只包含一个std::vector,以及一些决定如何选取向量值的特殊逻辑。我想添加一个方法,通过一次调用将多个值添加到我的类中。这是我添加一项的方法: void LoopGenerator::add(RandomStripe &stripe) { stripes.push_back(new SingleStripe(stripe)); } 我想要一个类似的方法,可以这样调用: LoopGenerator gen = LoopGenerat
容器
,它基本上只包含一个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
这是否可能只使用标准库,或者最好不使用标准库?如果您有C++11,您可以利用可变模板来实现这一点 在以前的版本中,我建议只进行方法链接:
LoopGenerator& LoopGenerator::add(RandomStripe &stripe)
{
stripes.push_back(new SingleStripe(stripe));
return *this;
}
并称之为
gen.add(RandomStripe()).add(RandomStripe()).add(RandomStripe()).add(RandomStripe())代码>您可以使用std::initializer\u 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 ); } );
}
传统的va_args需要一些方法来知道传递了多少个参数。或者,您可以使用可变模板(如果可用)。@TomášZato什么是随机条带和单条带?它们是不同的类型吗?@Vladfrommoskow是的,它们是不同的。实际上,SingleStripe
只是存在的,所以RandomStripe
可以与数组以及其他条带生成类一起使用SingleStripe
派生自与LoopGenerator
相同的类。随着要添加到堆栈中的元素数量的增加,用户是否应该更改代码以添加一个函数add()的调用?我正在重写代码,所以我花了一段时间才开始使用您的答案。我遇到以下错误:无法打开源文件“initializer_list”
我应该重新配置我的项目吗?@TomášZato您使用的编译器是什么?它支持C++ 2011吗?这表明事实并非如此。但我在微软的Visual Studio工作。这是相当复杂和混乱的。也许可以在某个地方启用。@TomášZato MS VS的版本是什么?
gen.add( { RandomStripe(), RandomStripe(), RandomStripe(), /*...*/ } );