Обеспечение соблюдения правил для «нетиповых» параметров шаблона - PullRequest
2 голосов
/ 15 января 2012

Я хочу иметь возможность применять определенные правила для шаблонных параметров "нетиповых" классов. Возможно ли это?

Например, рассмотрим шаблонный класс «Cycle», который циклически перебирает значения типа «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 <= MAX всегда выполнялось? То есть Как сделать так, чтобы программист использовал строку </p>

Cycle<int, 0, 23> hoursInADay;

будет разрешено, но программист использует строку

Cycle<int, 23, 0> hoursInADay;

будет предупрежден во время компиляции, что объявление неприемлемо?

1 Ответ

6 голосов
/ 15 января 2012

Вы можете добавить статическое утверждение:

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

До 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;
    // ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...