Во-первых, я верю, что вы изначально хотели вернуться
StaticVector<N>
Вместо всегда специализации с N == 3. Итак, что вы хотите сделать, это написать так:
template <unsigned int N>
class StaticVector {
public:
// because of the injected class-name, we can refer to us using
// StaticVector . That is, we don't need to name all template
// parameters like StaticVector<N>.
static StaticVector create3dVec(double x1, double x2, double x2) {
// create a new, empty, StaticVector
return StaticVector();
}
};
Если вы действительно хотите всегда возвращать 3dVector, вы, вероятно, захотите ограничить его значением N == 3, чтобы, например, StaticVector<4>::create3dVec
не работало. Вы можете сделать это, используя методику, описанную здесь .
Если вы хотите иметь функцию, подобную createVec
, которая работает с любым размером, вы, вероятно, захотите заменить параметры массивом. Вы можете сделать иначе, но это продвинутое и требует некоторых макро-трюков, примененных с препроцессором boost ::. Это не стоит того, я думаю. В следующей версии C ++ для этой цели будет предоставлено шаблонов переменных . В любом случае, подумайте над тем, чтобы использовать что-то вроде этого:
Я думаю, что это только усложнит это без необходимости здесь. Быстрое решение - вместо этого использовать boost :: fusion :: vector, поместив его в шаблон класса вместо версии выше:
static StaticVector createVec(double (&values)[N]) {
// create a new, empty, StaticVector, initializing it
// with the given array of N values.
return StaticVector();
}
Вы можете использовать его с
double values[3] = {1, 2, 3};
StaticVector<3> v = StaticVector<3>::createVec(values);
Обратите внимание, что он принимает массив по ссылке. Вы не можете дать ему указатель. Это потому, что он соответствует использованию параметров: вы не можете предоставить меньше или больше аргументов для другого способа. Это также защитит вас от подобных случаев:
// oops, values is a null pointer!
StaticVector<3> v = StaticVector<3>::createVec(values);
Массив никогда не может быть нулевым указателем. Конечно, если вам нравится, вы всегда можете изменить параметр массива на указатель. Это было бы просто моим личным предпочтением:)