2012-01-15 3 views
2

クラスの「非タイプ」テンプレートパラメータに対して特定の規則を適用したいと考えています。これは可能ですか?「非タイプ」テンプレートパラメータの規則を適用する

たとえば、 "MIN"と "MAX"の値の間のタイプ "TYPE"の値を循環するテンプレートの "Cycle"クラスを考えてみましょう。

template <class TYPE, TYPE MIN, TYPE MAX> 
class Cycle 
{ 
public: 
    Cycle() : 
    m_value(MIN) 
    { 
    } 

    const TYPE & value() const 
    { 
    return m_value; 
    } 

    void up() 
    { 
    if (m_value == m_max) 
     m_value = m_min; 
    else 
     ++m_value; 
    } 

    void down() 
    { 
    if (m_value == m_min) 
     m_value = m_max; 
    else 
     --m_value; 
    } 

private: 
    TYPE m_value; 

    static TYPE m_min; 
    static TYPE m_max; 
}; 

template <class TYPE, TYPE MIN, TYPE MAX> 
TYPE Cycle<TYPE, MIN, MAX>::m_min = MIN; 

template <class TYPE, TYPE MIN, TYPE MAX> 
TYPE Cycle<TYPE, MIN, MAX>::m_max = MAX; 

がどのように私はルールMIN < = MAXが常に成り立つ上記のように変更します

基本的な最初のステップは、次のようになりますか?私。どのように私は確か

Cycle<int, 0, 23> hoursInADay; 

ラインを使用して、プログラマが許可されますが、容認できないで宣言することをラインに

Cycle<int, 23, 0> hoursInADay; 

を使用して、プログラマはコンパイル時に警告されるでしょうか?作るのですか

答えて

6

あなたは、静的なアサーションを追加することができます。

static_assert(MIN <= MAX, "Invalid bounds"); 

プリC++ 11あなたはfalseブールに呼び出されたとき、コンパイル時エラーを生成し、独自の構造を調理する必要があります。例えばBoostの静的アサートのバージョンを取得します。

それ以外の場合、このような何か:

template <bool B> struct i_must_be_true;  // no definition! 
template <> struct i_must_be_true<true> { }; 

template <typename T, T MIN, T MAX> class Cycle 
{ 
    i_must_be_true<MIN <= MAX> m_check; 
    // ... 
}; 
+1

構文エラーに興味があるだけ、だろう 'MAX + 1> MIN'結果? – fredoverflow

+0

@FredOverflow:なぜでしょうか? 'i_must_be_true <(MAX > MIN - 1)>'完全にいいです:-) –

+0

static_assertは魅力的なようです。どうもありがとう。 – JimmidyJoo

関連する問題