2011-03-22 89 views
5

可以聲明,並在同一行初始化規則排列,就像這樣:實現數組初始化

int PowersOfTwo[] = {1, 2, 4, 8, 16, 32, 64, 128}; 

有沒有辦法複製的自定義類這種行爲?因此,舉例來說:

MyClass<int> PowersOfTwo = {1, 2, 4, 8, 16, 32, 64, 128}; 

你可以有一個拷貝構造函數需要一個數組作爲它的參數,但你仍然必須聲明上一行的數組。

int InitializationArray[] = {1, 2, 4, 8, 16, 32, 64, 128}; 
MyClass<int> PowersOfTwo = InitializationArray; 

回答

6

您可以實現以這樣的方式,你可以寫你的類:

MyClass<int> array; 
array = 1,2,3,4,5,6,7,8,9,10;//dont worry - all ints goes to the array!!! 

這是我實現:

template <class T> 
class MyClass 
{ 
    std::vector<T> items; 
public: 

    MyClass & operator=(const T &item) 
    { 
     items.clear(); 
     items.push_back(item); 
     return *this; 
    } 
    MyClass & operator,(const T &item) 
    { 
     items.push_back(item); 
     return *this; 
    } 
    size_t Size() const { return items.size(); } 
    T & operator[](size_t i) { return items[i]; } 
    const T & operator[](size_t i) const { return items[i]; } 

}; 

int main() { 

     MyClass<int> array; 
     array = 1,2,3,4,5,6,7,8,9,10; 
     for (size_t i = 0 ; i < array.Size() ; i++) 
      std::cout << array[i] << std::endl; 
     return 0; 
} 

輸出:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

見在線演示:http://www.ideone.com/CBPmj

兩個類似的解決方案,您可以在這裏看到我昨天發佈:

Template array initialization with a list of values


編輯:

類似的技巧,你可以做填充現有的STL容器。例如,你可以這樣寫:

std::vector<int> v; 
v+=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //push_back is called for each int! 

所有你需要重載(),操作爲:

template<typename T> 
std::vector<T>& operator+=(std::vector<T> & v, const T & item) 
{ 
    v.push_back(item); return v; 
} 
template<typename T> 
std::vector<T>& operator,(std::vector<T> & v, const T & item) 
{ 
    v.push_back(item); return v; 
} 

工作演示:http://ideone.com/0cIUD


再次編輯:

我是having fun with C++ operator。現在這個:

std::vector<int> v; 
v << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //inserts all to the vector! 

我覺得這看起來好多了!

+0

我想看看你試試看。我認爲你可能還需要一件事情,因爲逗號分隔列表int不知道它被分配的類型,賦值操作符具有最低優先級,所以它不會發現,直到太晚(我認爲)。 – 2011-03-22 17:56:58

+0

@Martin:我發佈了工作代碼鏈接。請看看! – Nawaz 2011-03-22 17:59:23

+1

@Martin:'operator,()'具有所有二元運算符的最低優先級,首先對operator =()進行評估,然後對所有運算符()進行評估。 – Xeo 2011-03-22 18:00:48

4

這是可以做到只有當你的編譯器提供支持initializer lists,一個C++ 0x中的功能。

否則,必須使用其他一些語法,如在boost.assign庫中。

+2

在Boost.Assign頁面開始的時候需要引用這個引號,並且立即顯示一個很好的例子:'運算符似乎很少有實際用途,()。' – Xeo 2011-03-22 17:56:53