2014-04-14 36 views
0

我一直在試圖簡化一些我的代碼,在我可以的地方簡化和調用。我一直在努力做的事情之一是將我遍佈整個地方的兩種常見過載融合成一個。它們如下:C++ Initializer_List進入指針向量

void MyClass::addSomething(Something & a) 
{ 
    vectorOfSomething.push_back(&a) 
} 

void MyClass::addSomething(std::vector<Something*> a) 
{ 
    for (unsigned int i = 0; i < a.size(); i++) 
     vectorOfSomething.push_back(a[i]); 
} 

該類有些東西是抽象的。 vectorOfSomething是指向Somethings的向量的向量。

本質,而不是必須這樣做:

std::Vector mySomethings = {&something1, &something2}; 
addSomething(mySomethings); 

我想這樣做:

addSomething({something1, something2}); 

所以它更類似於第一過載(無需用戶打造首先是一個指針向量)。縱觀我看到的兩種方式,無論是通過:std :: initializer_list還是variadic模板,我都不敢承認這兩個模板對我來說完全是陌生的。

我給它一個初始化列表的鏡頭,但遇到了很多嘗試各種事情的錯誤。我設法讓函數實際接受列表,但我無法弄清楚如何讓它正確地填充矢量。主要的問題似乎是init列表中的值是'const'。

如果任何人有任何想法如何使這項工作,我將不勝感激!

+0

爲什麼指向矢量?如果要共享對象的所有權,請在向量和原始對象作用域之間使用std :: shared_ptr。擁有指針向量(這應該是智能指針,從不是裸指針)的唯一理由是所有權共享(上文解釋)和多態性。我沒有在你的代碼中看到他們。我支付所有權共享,但你明確指針的使用,這是我討厭。 – Manu343726

+0

因此,請向我們展示更多關於您要解決的問題的背景。 – Manu343726

+0

在C++ 11中,可以使用語法'addSomething({something1,something2});'使用已有的函數:[ideone](http://ideone.com/wW1Te7)。 – user2079303

回答

0

事情是這樣的:

#include <iostream> 
#include <initializer_list> 
#include <vector> 
#include <list> 

struct MyClass { 
    template <typename It > 
    void Add(It b, It e) { 
     data_.insert(end(data_), b, e); 
    } 

    void Add(std::initializer_list<int> const & elems) { 
     Add(begin(elems), end(elems)); 
    } 

    template <typename T> 
    void Add(T const & cont) { 
     Add(begin(cont), end(cont)); 
    } 

    std::vector<int> data_; 

    friend std::ostream & operator<<(std::ostream & os, MyClass const & mc) { 
     for(auto & e : mc.data_) 
      os << e << " "; 
     return os; 
    } 
}; 

int main() { 
    MyClass foo; 

    foo.Add({ 1, 3 }); 

    std::vector<int> v { 1,2}; 
    foo.Add(v); 

    std::list<int> l { 4,5}; 
    foo.Add(l); 

    std::cout << foo; 
} 

編譯器不能推斷模板參數initializer_list,專業化必須是明確的。

+0

嘿,謝謝你的回答!當我嘗試這種方法時,我仍然收到錯誤:不能將'const Something'轉換爲'Something *'。我不能說我太熟悉這些模板類型的工作原理了,但我試着改變正在傳遞的內容,而我所能做的只是導致更多的錯誤。有任何想法嗎? – Kyuur