2016-04-22 25 views
0

私は現在、テンプレートパラメータとして与えられた一定数のビットを格納するために必要な種類を推定小さなテンプレートを実装しようとしています特定のビットサイズのために、このテンプレートを特化しようとしている:値の型推論は

template<> 
class Register<8> 
{ 
public: 
    unsigned char type; 
}; 

template<> 
class Register<16> 
{ 
public: 
    unsigned short type; 
}; 

template<unsigned int N> Register<N+1>; 

残念ながら、これは意図したとおりに動作し、コンパイルに失敗していません:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Register<32>::type val32 = 0xDEADBEEF; 
    assert(sizeof(val) == sizeof(unsigned long)); 

    Register<16>::valType val16 = 0xBEEF; 
    assert(sizeof(val) == sizeof(unsigned short)); 

    Register<8>::valType val8 = 0xEF; 
    assert(sizeof(val) == sizeof(unsigned char)); 

    Register<4>::valType val4 = 0xF; 
    assert(sizeof(val) == sizeof(unsigned char)); 

    return 0; 
} 

誰かが助けてくれるテキストのポインタを教えてくれたり、 私のアプローチが間違っていると教えてください。

答えて

5

あなたはタイプメンバーではなく、データメンバたい:

template <std::size_t N> struct Register 
{ 
    using type = unsigned long int; 
}; 

template <> struct Register<8> 
{ 
    using type = unsigned char; 
}; 

// ... 

使用法:

template <typename T> void f() 
{ 
    typename Register<sizeof(T) * CHAR_BIT>::type thing; 
    // ... 
} 
+0

感謝を。私はそれを完全に見落とした。このテンプレートを一般的な方法で他のすべてのパラメータ値(1〜32)に拡張できますか?つまり、 <17>レジスタは自動的にRegister <32>宣言を選択しますか? – fhw72

+1

@ fhw72:はい。最も近い実装された値に「スナップ」する何らかの中間ディスパッチ機構を持つことができます。 –

+0

これはコンパイル時にも達成できますか? Register のようにRegister ....などを使用して、次に明示的に定義されたテンプレートで「スナップ」しますか? – fhw72