2012年6月13日水曜日

C++でtypedefのテンプレート化のようなもの

C99のstdint.hを使えばint8_tやuint16_t等のビット幅を指定した型を利用できるが、この8や16等のビット幅をC++のテンプレート引数にしたい。が、typedefはテンプレート化できないし、classはオーバーヘッドが大きくて嫌だ。さて、どうにかならないか考えてみた。
template <size_t width> union uint_u;
template<> union uint_u<8> {uint8_t v;};
template<> union uint_u<16> {uint16_t v;};
template<> union uint_u<32> {uint32_t v;};
template<> union uint_u<64> {uint64_t v;};
template <size_t width> union sint_u;
template<> union sint_u<8> {int8_t v;};
template<> union sint_u<16> {int16_t v;};
template<> union sint_u<32> {int32_t v;};
template<> union sint_u<64> {int64_t v;};

こんなのを定義しておいて
uint_u<16> u16;
sint_u<64> s64 = {-123456};
s64.v = u16.v * -77;
こんな感じで使うのはどうだろう?

…う〜ん、やっぱりダサいから没。これならマクロを使うか、がっつりclassを組んでコンパイラの最適化に期待する方がいいかな。

0 件のコメント:

コメントを投稿