Проверка времени компиляции параметра нетипового шаблона С++

У меня есть класс С++ с двумя параметрами шаблона, отличными от типа:

Измерение типа size_t и постоянная ссылка на вектор объектов.

template <size_t DIMENSION, const std::vector<Tuple>& BORDERS>
class Rule {
public:

  Rule(const std::vector<Tuple>& ranges, const Action& action) :
      ranges_(ranges),
      action_(action) {};

private:

  std::vector<Tuple> ranges_;
  Action action_;
};

Есть ли возможность во время компиляции гарантировать выполнение следующего условия?

DIMENSION == BORDERS.size()

Заранее благодарим вас за любые предложения.


person Sven Hager    schedule 07.11.2013    source источник
comment
static_assert(DIMENSION == BORDERS.size(), размеры не совпадают);   -  person Exceptyon    schedule 07.11.2013
comment
Я не думаю, что std::vector& можно использовать как константное выражение, и даже если это так (потому что компилятор, возможно, будет рассматривать его как указатель?), его члены и состояние не могут использоваться как таковые   -  person Asaf    schedule 07.11.2013
comment
Ссылки @Asaf можно использовать как параметры шаблона, не относящиеся к типу, как показано в примере. Я почти уверен, что это не сработает так, как ожидает Свен.   -  person Arne Mertz    schedule 07.11.2013
comment
@ArneMertz, несмотря на это, .size() - это функция времени выполнения, которая зависит от состояния времени выполнения векторного объекта.   -  person Asaf    schedule 07.11.2013


Ответы (1)


vector — это динамический контейнер, поэтому его размер зависит от того, как вы его используете во время выполнения. К сожалению, это означает, что нет никакой проверки во время компиляции, которую вы можете сделать, чтобы достичь того, чего вы хотите.

std::array может быть более подходящим в этом случае, так как его размер фиксируется во время компиляции.

person Peter Bloomfield    schedule 07.11.2013
comment
Спасибо за ваш ответ. К сожалению, я не знаю, как интегрировать std::array в приведенный выше код, так как мне нужно указать размер массива в качестве параметра шаблона. - person Sven Hager; 07.11.2013
comment
Это на самом деле очень просто. std::array также принимает размер в качестве параметра шаблона. Например, чтобы получить массив из 5 целых чисел, вы объявляете: std::array<int, 5>. В приведенном выше примере вы бы просто сделали: std::array<Tuple, DIMENSION>. (Кстати, нет необходимости использовать сам контейнер в качестве параметра шаблона. Подойдет только размер.) - person Peter Bloomfield; 07.11.2013