对“非类型”模板参数实施规则

时间:2012-01-15 13:21:15

标签: c++ templates

我希望能够对类的“非类型”模板参数强制执行某些规则。这可能吗?

例如,考虑一个模板化的“循环”类,它循环通过“TYPE”类型的值,在值“MIN”和“MAX”之间。

基本的第一步可能如下所示:

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&lt; = MAX始终保持不变?即如何确保程序员使用

Cycle<int, 0, 23> hoursInADay;

将被允许,但程序员使用该行

Cycle<int, 23, 0> hoursInADay;

会在编译时警告声明是不可接受的吗?

1 个答案:

答案 0 :(得分:6)

您可以添加静态断言:

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

Pre-C ++ 11你必须编写自己的构造,在false bool上调用时会产生编译时错误;例如采用Boost版本的static-assert。

其他类似的事情:

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;
    // ...
};