2012-06-24 42 views
0

在我的代碼我希望能夠做帶有可變參數列表初始化表

Table<double> tbl; 
tbl.Create(2, 2, 1.0, 2.0, 3.0, 4.0); 

,通過構造太

Table<double> tbl(2, 2, 1.0, 2.0, 3.0, 4.0); 

從我的經驗用省略號(...)導致幾個難以追蹤的錯誤,所以我想出了以下初始化我的表格:

void Create(size_t rows, size_t columns, T val0) 
{ 
    ASSERT(rows * columns == 1); 
    Create(rows, columns); 
    _data[0] = val0; 
} 

void Create(size_t rows, size_t columns, T val0, T val1) 
{ 
    ASSERT(rows * columns == 2); 
    Create(rows, columns); 
    _data[0] = val0; 
    _data[1] = val1; 
} 

void Create(size_t rows, size_t columns, T val0, T val1, T val2) 
{ 
    ASSERT(rows * columns == 3); 
    Create(rows, columns); 
    _data[0] = val0; 
    _data[1] = val1; 
    _data[2] = val2; 
} 

我想你會得到想法。但是,如果我想要多達50個元素的功能,這變得相當煩人。更不用說我必須寫出所有這些構造函數了。沒有其他的方法可以更優雅地處理這個問題嗎?

編輯:也許我應該解釋爲什麼我不想在這種情況下使用省略號(...)。讓我們看看下面的代碼:

Table<double> tbl(2, 2, 1.5, 2.1, 3, 4.5); 

編譯器解釋第五參數爲int類型,這顯然是不打算。

回答

3

可變參數模板和初始化列表可能的工作:

struct Table 
{ 
    std::vector<double> data; 

    template <typename ...Args> 
    Table(Args &&... args) 
    : data({std::forward<Args>(args)...}) 
    { } 
}; 
+0

感謝您的答覆,但我很想解決這個問題,而無需使用C++ 11層的特性。 – demorge

+0

如果你不想使用'C++ 11'特性,或許你最好的機會是將它傳遞給一個'double'數組(並且它的大小)並且從它初始化。像'double tmp [] = {2,2,1.5,2.1,3,4.5};表 tbl(tmp,6);'或者寫一個宏來爲你做。 – Shahbaz

+0

Pre-11 C++對於使用原始C數組非常糟糕。變量函數非常非C++,因爲您沒有任何類型安全性,並且不可能告訴您正確使用它們。 –