Во-первых, я считаю, что вы изначально собирались вернуться
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 :: preprocessor. Думаю, это того не стоит. Следующая версия 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);
Массив никогда не может быть нулевым указателем. Конечно, если хотите, вы всегда можете изменить параметр массива на указатель. Это было бы моим личным предпочтением :)
person
Johannes Schaub - litb
schedule
31.01.2009