Template 版的 n 維陣列

最簡單的作法, 假設每一維度僅有 10 個元素,
以下能夠宣告在編譯其中任意維度的整數陣列:

template<int DIM>
class Array{
public:
Array<DIM-1> Data[10];
Array<DIM-1>& operator[](int i){
return Data[i];
}
};


template<>
class Array<1>{
public:
int Data[10];
int& operator[](int i){
return Data[i];
}
};

將 [] 這個 operator 重載的主要理由, 是要將這個版本的多維陣列,
當作我們所習慣的用法, 不然 a[i][j] 就要變成 a.Data[i].Data[j] 。

宣告一個三維陣列很簡單, 只有

Array<3> array;

使用上也是 array[i][j][k] 存取, 注意第一個 array[i] 是一個 Array<2>。
比起原本二維陣列的宣告方式, 有沒有漂亮多了呢?XD
要拿掉 10 個元素的限制也很簡單, 只要再修改 class constructor, 也沒什麼問題,
覺得太麻煩就改用 boost 函式庫提供的吧。

補上一個更噁心的 …

template<typename T,
int DIM = 2,
template <typename ELEM, typename = std::allocator<ELEM> >
class CONT = std::deque >
class Array : public CONT< Array<T, DIM-1, CONT> >{};


template<typename T,
template <typename ELEM, typename = std::allocator<ELEM> >
class CONT>
class Array<T, 1, CONT> : public CONT<T> {};

基本上就是 template templete parameters 加上 CRTP 的技術 @”@
要怎麼用呢?

Array<int> array; // 等價於 std::deque< std::deque< int > >
Array<double, 3, std::vector> // 等價 std::vector< std::vector< std::vector<double> > >

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s