D'abord, je crois que vous voulez dire à l'origine pour retourner
StaticVector<N>
Au lieu de toujours une spécialisation avec N == 3.Donc, ce que vous voulez faire est écrit comme ceci:
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();
}
};
Si vous voulez vraiment revenir toujours un 3dVector, vous voudrez probablement limiter à N == 3, de sorte que, par exemple StaticVector<4>::create3dVec
n » t travail. Vous pouvez le faire en utilisant la technique décrite here.
Si vous voulez avoir une fonction comme createVec
qui fonctionne avec n'importe quelle taille, vous voudrez probablement remplacer les paramètres par un tableau. Vous pouvez faire autrement, mais cela est avancé et nécessite quelques astuces de macro appliquées avec boost :: preprocessor. Ça ne vaut pas le coup je pense. La prochaine version C++ fournira modèles variés à cette fin. Quoi qu'il en soit, pensez à utiliser quelque chose comme ceci:
Je pense que cela ne ferait que compliquer inutilement ici. Une solution rapide est d'utiliser un boost :: fusion :: vecteur lieu, le mettre dans le modèle de classe au lieu de la version ci-dessus:
static StaticVector createVec(double (&values)[N]) {
// create a new, empty, StaticVector, initializing it
// with the given array of N values.
return StaticVector();
}
Vous pouvez l'utiliser avec
double values[3] = {1, 2, 3};
StaticVector<3> v = StaticVector<3>::createVec(values);
Notez qu'il accepte un tableau par référence. Vous ne pouvez pas lui donner un pointeur. C'est parce qu'il correspond à l'utilisation des paramètres: Vous ne pouvez pas fournir moins ou plus d'arguments pour l'autre sens. Il vous protégera également des cas comme ceci:
// oops, values is a null pointer!
StaticVector<3> v = StaticVector<3>::createVec(values);
Un tableau ne peut jamais être un pointeur nul. Bien sûr, si vous le souhaitez, vous pouvez toujours changer le paramètre de tableau en pointeur. Il serait tout simplement ma préférence personnelle :)
Vous devez remplacer public par classe dans votre exemple. – Klaim