Чтобы проиллюстрировать ситуацию, давайте предположим минимальный пример: шаблонный класс Vector
, принимающий свое измерение в качестве нетипичного параметра шаблона.Этот класс будет предоставлять x()
, y()
(и т. Д.) Методы доступа, когда измерение позволяет это:
template <int N_dimension>
class Vector
{
public:
// ctors, etc.
int &x();
template <class = std::enable_if_t<(N_dimension>2)>> int &y();
private:
std::array<int, N_dimension> mData;
};
Тем не менее, это не работает, поскольку enable_if
может применяться только к выведены параметры шаблона.
Наш текущий обходной путь выглядит громоздким:
template <int N=N_dimension, class = std::enable_if_t<(N>2)>> int &y();
Более того, он также требует статического утверждения в определении, чтобы убедиться, что оно защищено от ошибок (посколькутеперь клиентский код может дать явное значение для N
, которое не соответствует реальному измерению. Редактировать : Или явное значение для анонимного второго параметра шаблона, как указано SergeyA ).
Есть ли более прямой подход для выражения этого в C ++?