2015-06-22 18 views
1

我正在處理C++ 03的元組類。我希望能夠從列表構造它,這是因爲元組的長度可能會變化而變得棘手。在C++中建模初始化器列表03

#ifndef N_TUPLE_H 
#define N_TUPLE_H 


template <typename T, int N> 
class N_Tuple 
{ 
public: 
    N_Tuple(T values[N]); 
private: 
    T values_[N]; 
}; 


template <typename T, int N> 
N_Tuple< T, N >::N_Tuple(T values[N]) 
{ 
    for (int i = 0; i != N; ++i) 
    values_[i] = values[i]; 
} 


#endif 

目前,我必須這樣做:

int arr[] = { 0, 1, 2 }; 
N_Tuple< int, 3 > t(arr); 

似乎笨重,不太人性化。是否有可能在C++ 03中將其減少到一行?

在此先感謝。

+0

根據http://stackoverflow.com/questions答案/ 13267277/where-can-we-use-list-initialization「在C++ 03中,您只能使用列表初始化進行聚合(C++ 03 [dcl.init.aggr])和標量(C++ 03 [ DCL。init]/13)類型「這意味着你不能爲數組做什麼。」 –

+0

@JerryJeremiah *「這意味着你不能爲數組做這件事。」* Huh?數組*。* – dyp

+0

我一定讀過錯誤的n ...對不起, –

回答

1

它看起來很笨重,不是非常用戶友好。是否有可能在C++ 03中將其減少到一行?

因爲你基本上是模仿std::array,剛剛擺脫構造:

template <typename T, int N> 
class N_Tuple 
{ 
public: 
    T values_[N]; 
}; 

注意,在這一點,你必須做出values_公衆。

這樣,您可以初始化它們,就像你期望:

N_Tuple<int,3> p = {1,2,3}; 

這是在C++ 03有效,C++ 11,沒有任何形式的擴展(TR1,升壓或其他)要求。

另一種選擇是將輔助數組隱藏在宏的後面。基本的想法是初始化你的助手數組,並從那裏你的元組類型的數組。但是因爲你希望數組的內容在初始化符號後出現(var x = contents),所以你必須使用類似prolog-epilog宏的東西,這需要重複一次,你必須小心在您的特定類型的情況下,逗號:

SOME_MACRO_BEGIN(My_Sequence_type, t) = {1, 2, 3} 
SOME_MACRO_END(My_Sequence_type, t); 

我已經worked on such a solution這是與兩個C++ 03和C++ 11兼容的(前提是您實現一個initializer_list構造函數C++ 11的情況下)在C++ 03方面沒有任何特別的要求。我不確定在一個宏中怎麼可能做到這一點,因爲元素列表將包含特殊處理的逗號,宏和變量宏不是C++中的事情03 )

但是,除非您的列表很短,或者您將prolog-epilog宏的名稱縮寫了很多,否則它將不太適合單行。

(此外,它仍然需要數據的複製,即使對於最簡單的種類型永遠不會沒關係)