2012-01-15 55 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