Я пытаюсь определить набор обобщенного c кода в шаблоне класса, а затем добавить некоторую функциональность, которая задает c для некоторых значений параметров шаблона. Короче говоря:
// A vector of linear algebra
template <int n>
struct Vector
{
// A bunch of functions not relying on a specific value for n
float norm() { ... }
float dot(const Vector& other) { ... }
private:
float _data[n];
};
Это все хорошо, но трехмерные векторы, в частности, имеют двухкомпонентное перекрестное произведение, в то время как векторы в других измерениях нет (ну, некоторые делают, но это не то, что это около). Я мог бы использовать SFINAE, чтобы функция cross
была определена только для n = 3, однако я бы предпочел иметь возможность определять все функции, которые не зависят от определенного значения c вместе, а затем реализовать остальное в независимых шаблонных специализациях.
Когда я оглядывался по сторонам, я видел идею наследования от развлеченного шаблона класса, но тогда я не хочу переопределять новый тип. Кроме того, это, очевидно, не работает (несколько ожидаемо):
template <>
struct Vector<3> : public Vector<3> // error: invalid use of incomplete type ‘struct Vector<3>’
{
Vector cross(const Vector& other) { ... }
};
Другими словами, я хочу специализировать свой класс Vector
, но сохранить все функции, уже определенные в шаблоне класса, только добавляя больше .
Есть ли альтернатива SFINAE или это мой единственный вариант?