2010年1月12日 星期二

Boost的array跟Static Assert

好久沒寫些新玩意了,打響2010第一砲吧。
這次是要介紹boost裡面一些簡單的玩意,arrayStatic Assert。兩者分別納入了C++ TR1C++ 0x,所以不用害怕學了之後以後用不到。

C語言的array一樣,相較於STL的vector來說,在runtime的時候執行速度較快,而缺點就是不能套用STL中一堆現成的Algorithm。因此就有個折衷之道,幫array加上一層wrapper,因此就成了Boost Array。

類似的程式碼長這樣,請詳閱boost/array.hpp內實做。

template<class T, size_t N>
class array {
T elems[N];
public:
// ignore
};







公開的function就是實做STL Container所需之必備條件,在此不直說了。這邊也提供一個使用array的簡單範例。



#include <boost/array.hpp>
#include <iostream>
int main()
{
typedef boost::array<int, 4> Array4;
Array4 s = {1, 2, 3, 4};
for (Array4::iterator p = s.begin(); p != s.end(); ++p)
std::cout << *p << std::endl;
}


至於Static Assert,是相對於C語言流傳已久的assert函數,在runtime的時候檢查判別式是否為真;而這邊的static就是在編譯的時候就能判斷出來。

至於實做方式,用到了Template Specialization


關鍵在於



template <bool x> struct STATIC_ASSERTION_FAILURE;

template <> struct STATIC_ASSERTION_FAILURE<true> {
enum { value = 1 };
};


而STATIC_ASSERTION_FAILURE<false>的情況沒有定義,當需要用到時便會產生Compile Errror。



由於C++ 0x的static assert是內建語法,跟Boost的語法不同,這裡就不多介紹Boost的範例。不過觀念跟邏輯是相同的。

 

我們搬家了

新部落格在http://b-plurkers.com/