У меня есть проблема, которую я придумал недавно. На самом деле я думаю, что это не может быть решено, как мне бы хотелось, но было бы очень удобно, если бы это было возможно. Так или иначе, вот проблема:
Я приведу вам пример, который я видел несколько дней назад на этом форуме, так как с ним будет легче объяснить. Допустим, я пытаюсь создать структуру Tensor таким образом :
template <int N>
struct Tensor
{
Tensor<N - 1> x;
Tensor<N - 1> y;
Tensor<N - 1> z;
};
. Чтобы избежать бесконечной рекурсии, мне пришлось бы написать специализацию шаблона для N = 1.
template<>
struct Tensor<1>
{
double x;
double y;
double z;
};
На самом деле, когда N = 1, этот Tensor на самом деле является Вектор (физический ). Допустим, у меня уже есть структура Vector, определенная таким образом :
struct Vector
{
double x;
double y;
double z;
};
. Эта структура точно такая же, как Tensor<1>. Поскольку структура Vector уже существовала и, допустим, я не реализовал ее сам, я хотел бы иметь возможность сделать структуру Tensor<1> псевдонимом структуры Vector. Так же, как определение типа. Итак, я хотел бы сделать это таким образом:
// C++03
typedef Vector Tensor<1>;
// or C++11
using Tensor<1> = Vector;
Таким образом, Tensor<1> и Vector были бы одной и той же структурой, поэтому я мог бы использовать одну вместо другой в программе, где бы я ни хотел, и у меня не было бы написать одну и ту же структуру дважды.
Однако на самом деле невозможно определить специализацию шаблона таким образом. Если бы это было так, я бы не задавал здесь вопрос.
Примечание.:Я знаю, что предыдущий пример не очень хорош, поскольку мы все еще можем сделать это.:
using Vector = Tensor<1>;
Но это довольно утомительно, если я хочу сделать это со специализациями двух разных структур. Например, при написании геометрической библиотеки, которая могла бы вычислять геометрию в N -пространственных измерениях:
using Circle<2> = Hypersphere<2>;
Итак, подводя итог :, есть ли способ создать специализации шаблона, определив его как псевдоним другого?