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;
将在编译时警告说,不能接受的申报程序员?
只是好奇,会'MAX + 1> MIN'结果语法错误? – fredoverflow 2012-01-15 13:42:51
@FredOverflow:为什么呢? 'i_must_be_true <(MAX > MIN - 1)>'非常好:-) – 2012-01-15 13:44:03
static_assert似乎很有魅力。非常感谢。 – JimmidyJoo 2012-01-15 13:46:27