dans cette question:
template; Point<2, double>; Point<3, double>
Dennis et Michael a remarqué le constructeur déraisonnable mis en œuvre bêtement.
Ils avaient raison, je n'ai pas considéré cela à ce moment-là. Mais j'ai découvert qu'un constructeur ne permet pas beaucoup pour une classe de modèle comme celui-ci, au lieu d'une fonction est ici beaucoup plus commode et sûrclasse modèle: cteur contre la fonction -> nouveau standard C++
namespace point {
template < unsigned int dims, typename T >
struct Point {
T X[ dims ];
std::string str() {
std::stringstream s;
s << "{";
for (int i = 0; i < dims; ++i) {
s << " X" << i << ": " << X[ i ] << ((i < dims -1)? " |": " ");
}
s << "}";
return s.str();
}
Point<dims, int> toint() {
Point<dims, int> ret;
std::copy(X, X+dims, ret.X);
return ret;
}
};
template < typename T >
Point< 2, T > Create(T X0, T X1) {
Point< 2, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1;
return ret;
}
template < typename T >
Point< 3, T > Create(T X0, T X1, T X2) {
Point< 3, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1; ret.X[ 2 ] = X2;
return ret;
}
template < typename T >
Point< 4, T > Create(T X0, T X1, T X2, T X3) {
Point< 4, T > ret;
ret.X[ 0 ] = X0; ret.X[ 1 ] = X1; ret.X[ 2 ] = X2; ret.X[ 3 ] = X3;
return ret;
}
};
int main(void) {
using namespace point;
Point< 2, double > p2d = point::Create(12.3, 34.5);
Point< 3, double > p3d = point::Create(12.3, 34.5, 56.7);
Point< 4, double > p4d = point::Create(12.3, 34.5, 56.7, 78.9);
//Point< 3, double > p1d = point::Create(12.3, 34.5); //no suitable user defined conversion exists
//Point< 3, int > p1i = p4d.toint(); //no suitable user defined conversion exists
Point< 2, int > p2i = p2d.toint();
Point< 3, int > p3i = p3d.toint();
Point< 4, int > p4i = p4d.toint();
std::cout << p2d.str() << std::endl;
std::cout << p3d.str() << std::endl;
std::cout << p4d.str() << std::endl;
std::cout << p2i.str() << std::endl;
std::cout << p3i.str() << std::endl;
std::cout << p4i.str() << std::endl;
char c;
std::cin >> c;
}
a la nouvelle norme C++ de nouvelles améliorations, les caractéristiques linguistiques ou simplifications concernant cet aspect de ctor d'une classe modèle?
Que pensez-vous de l'implémentation de la combinaison de namespace, stuct et Create function?
un grand merci à l'avance
Oops
Ne devriez-vous pas vérifier que le 'initializer_list' a un nombre approprié d'articles? Aussi, pourquoi ne pas utiliser un 'std :: array'? (Trop mauvaise implémentation 'initializer_list' est complètement rompu avec ma version de GCC.) – UncleBens
@UncleBens: Oui, vous devriez vérifier que la liste initializer_list est assez grande.'std :: array' aurait probablement du sens ici aussi - je ne suis pas habitué à l'utiliser encore ... –
J'ai aussi suggéré des modèles variés. Mais pouvez-vous vérifier la taille de 'initializer_list' à la compilation? - Je pense aussi que 'vector' n'est peut-être pas très approprié ici: on veut que ces choses soient légères, et l'allocation dynamique et l'overhead de l'espace pourraient être trop ... pour stocker 2 ou 3 doubles/ints. – UncleBens