2016-09-14 13 views
1

をテンプレートタイプをチェックし、コンパイル時エラーを強制:これは私がやろうとしています何である一定の

#define SIZE 8 

template<class T> 
struct name { 
    T a; 
    name() { 
     #if SIZE != sizeof(T)*8 
     #error Size mismatch 
     #endif 
    } 
}; 

int main(void) 
{ 
    name<uint16_t> a; //Size mismatch 

    return 0; 
} 

私が使用しているときのサイズが一致しない場合には、コンパイル時エラーを与えたいですテンプレート化された構造体ie name<uint16_t>は、要件(sizeof(T)*8 == 8)に準拠していないため、コンパイル時エラーが発生します。

<C++11でこれを行うことはできますか?

+0

boostには独自のバージョンのSTATIC_ASSERTがあります。http://www.boost.org/doc/libs/1_61_0/doc/html/boost_staticassert.html –

+0

@πάνταῥεῖ:おそらく私の問題は何とか解決されますが、 enable_if'の実装[ここ](http://en.cppreference.com/w/cpp/types/enable_if)使用法: 'template :: type> struct name ...'(私はちょうど答えとして投稿していました:D) – Jahid

答えて

2

あなたはそれを主張することができます

static_assert(SIZE != sizeof(T)*8, "!"); 

あなたのコードは次のようになります。

#include<cstddef> 

#define SIZE 8 

template<class T> 
struct name { 
    static_assert(SIZE != sizeof(T)*8, "!"); 
    T a; 
}; 

int main(void) { 
    name<uint16_t> a; 
    return 0; 
} 

EDIT

この答えはC++ 11以降に適用されます。
私はそれを書きましたので、とにかくそれ以上の読者のために残しておきます。

+0

私はこの答えがC++ 11以上であることを指摘したいと思います –

+0

@ nasser-sh OPが要求したものではありませんか?彼は言った - _これはC++ 11でできますか?_。 – skypjack

+0

ああ!投稿の編集履歴を見ると、OPは「

関連する問題