2012-01-15 21 views
2

我希望能夠對類的「非類型」模板參數執行某些規則。這可能嗎?對「非類型」模板參數執行規則

例如,考慮循環遍歷值「MIN」和「MAX」之間的類型「TYPE」值的模板化「循環」類。

一個基本的第一步可能是這個樣子:

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 2012-01-15 13:42:51

+0

@FredOverflow:爲什麼呢? 'i_must_be_true <(MAX > MIN - 1)>'非常好:-) – 2012-01-15 13:44:03

+0

static_assert似乎很有魅力。非常感謝。 – JimmidyJoo 2012-01-15 13:46:27