好久沒寫些新玩意了,打響2010第一砲吧。
這次是要介紹boost裡面一些簡單的玩意,array 跟Static Assert。兩者分別納入了C++ TR1跟C++ 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的範例。不過觀念跟邏輯是相同的。
沒有留言:
張貼留言