2014-12-05 37 views
4

我正在創建一個類 - 我們稱它爲Container - 基本上只包含一個std::vector和一些決定向量值如何挑選的特殊邏輯。我想添加一個方法用一次調用將多個值添加到我的類中。這是我的方法,增加了一個項目:採用可變數量的參數,並將它們放在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

這可能只是與標準庫,或最好沒有他們?

+1

傳統va_args需要一些方法來知道許多參數如何傳遞。或者,您可以使用可變參數模板(如果可用)。 – 2014-12-05 21:03:30

+0

@TomášZato什麼是RandomStripe和SingleStripe?他們是不同的類型? – 2014-12-05 21:07:38

+0

@VladfromMoscow是的,他們是不同的。實際上,'SingleStripe'只是存在的,所以'RandomStripe'可以和其他的條帶生成類一起使用。'SingleStripe'派生自與LoopGenerator相同的類。 – 2014-12-05 21:26:29

回答

5

您可以使用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(), /*...*/ }); 
+0

我正在重寫代碼,所以花了我一段時間纔開始使用您的答案。我得到以下錯誤:'無法打開源文件「initializer_list」'我應該重新配置我的項目? – 2014-12-06 20:29:59

+0

@TomášZato你在用什麼編譯器?它支持C++ 2011嗎? – 2014-12-06 20:32:01

+0

[快速搜索](http://stackoverflow.com/a/10849807/607407)表明它沒有。但我正在MS Visual Studio中工作。這是相當複雜和混亂。也許它可以在某個地方啓用。 – 2014-12-06 21:11:58

0

如果你有C++ 11,你可以使用可變參數模板來實現這一點。

在之前的版本,我建議只是在做方法鏈接:

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

,並調用它gen.add(RandomStripe()).add(RandomStripe()).add(RandomStripe());

+0

作爲要添加到堆棧元素的數量增加,如果用戶更改代碼添加一個更多的函數調用add()? – 2014-12-05 21:40:14

相關問題