2012-02-01 2 views
8

私はこのような何かを持っている:テンプレートはビットサイズを指定することによってchar/short/intの間で選択できますか?

template<int SIZE> 
struct bin { 
private: 
public: 
    struct { 
     int _value : SIZE; 
    }; 
} 

はサイズに応じて_valueのデータ型を変更することが可能ですか? SIZEが< = 7の場合、_valueをcharにします。もしそれが> 8で< = 15なら、私はそれを短くしたいと思います。それが< = 31ならば、それを整数にします。

答えて

10

これは特にエレガントではありませんが、:あなたのクラスで次に

template <unsigned int N> 
struct best_integer_type { 
    typedef best_integer_type<N-1>::type type; 
}; 

template <> 
struct best_integer_type<0> { 
    typedef char type; 
}; 

template <> 
struct best_integer_type<8> { 
    typedef short type; 
}; 

template <> 
struct best_integer_type<16> { 
    typedef int type; 
}; 

template <> 
struct best_integer_type<32> { 
    // leave out "type" entirely, to provoke errors 
}; 

typename best_integer_type<SIZE>::type _value; 

それはSIZEのために負の数を扱っていません。元のコードもありませんが、SIZE <= 7の場合、charを使用するようにテキストの説明に記載されています。私は0 <= SIZE <= 7がやります。

+0

ありがとう、それは私が探していたものです。私が期待したよりもうまくいく – Markus

+0

ある時点では、コンパイルの速度に心配するかもしれません。 –

+0

@ edA-qa mort-ora-y:コンパイルメモリの使用であり、実装は一般に、テンプレートインスタンス化のための固定された最大「再帰深度」を課す。 'bin b;'と書けば、不愉快なことが起きるでしょう。しかし、合理的な数値のみを使用すると仮定すれば、コンパイラは31種類(TU単位)を作成する必要があります。これは、人為的な例を除いて重要な負担となることはまずありません。私はオーバーヘッドに数桁の悪化をもたらす標準テンプレートがあると思います。 –

8

Boost.Integerはutilities for type selectionを有する:

boost::int_t<N>::least
符号ビットを含む少なくともNビットと最小、ビルトイン、符号付き整数型。パラメータは正の数でなければなりません。パラメータが最大整数型のビット数より大きい場合、コンパイル時エラーが発生します。

boost::int_t<N>::fast
符号ビットを含め、少なくともNビットの組み込み型の符号付き整数型が最も簡単です。パラメータは正の数でなければなりません。パラメータが最大整数型のビット数より大きい場合、コンパイル時エラーが発生します。

+1

私はそれを持っていた 'boost'を知っていたはずです... –

+1

@Matthieu:ちょうどブーストが欠落しています。コーヒー? :) –

関連する問題