Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取可变数量的参数并将它们放入std::vector中_C++_Vector_Overloading - Fatal编程技术网

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(), /*...*/ } );