C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Question concernant la surcharge d'opérateur

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
xavier
Guest





PostPosted: Thu Jan 13, 2005 10:14 am    Post subject: Question concernant la surcharge d'opérateur Reply with quote



Soit la hiérarchie suivante :
// vec.h

template <typename N, std::size_t C, typename Conv = conversion_trait
class Vec : public boost::array<N, C> {
// ...
};

template <typename N, typename Conv = conversion_trait
class Vec3 : public Vec<N, 3, Conv> {
public:
// constructeurs
Vec3();
Vec3(N const &, N const &, N const &);
template <typename M>
explicit Vec3(M const &); // [1] (assignation d'une valeur à tous les
éléments)
template <typename M, std::size_t C2, typename Conv2>
explicit Vec3(Vec<M, C2, Conv2> const &); // [2]
// ...
};

// ... definition de Vec4 héritant de Vec<N, 4, Conv>

//eof


si j'écris ensuite :

....
Vec4<int> s(1);
Vec3<double> v(s); // [3]
....

Le constructeur appelé en [3] est le constructeur [1], alors que
j'aimerais que ce soit [2].

Actuellement, les seules solutions que j'ai trouvé sont

1) remplacer [2] par :
Vec3(N const &);

2) Ajouter un constructeur :
template <typename M, typename Conv2>
explicit Vec3(Vec4<M, Conv2> const &);

Mais aucune des deux ne me satisfait. La première me faisant perdre
l'avantage de l'appel à conversion_trait<double>::template <typename M>
convert_from<M>(),
la deuxième m'obligeant à réécrire un peu trop de code à mon goût.

Y-aurait-il un moyen supplémentaire (en ajoutant des opérateur de
casting, par exemple) pour arriver à mes fin ?
Back to top
xavier
Guest





PostPosted: Mon Jan 17, 2005 10:53 am    Post subject: Re: Question concernant la surcharge d'opérateur Reply with quote



J'ai trouvé une autre solution, que je juge satisfaisante, pour mon
problème, en utilisant boost::type_traits :

// vec.h

template <typename N, std::size_t C, typename V> class Vec;

template <bool is_arithmetic>
struct vec_assignation_trait {
template <typename N, std::size_t C, typename V, typename N2>
static void assign(Vec<N, C, V> & d, N2 const & s) {
d.assign(V::convert_from<N2>(s));
}
};

template <>
template <typename N, std::size_t C, typename V, typename N2>
void vec_assignation_trait<false>::assign(Vec<N, C, V> & d, N2 const & s) {
// assume N2 is a Vec<>
V::move_from<N2>(d.c_array(), s.data(),
std::min(C, N2::element_count);
}

template <typename N, std::size_t C, typename V>
class Vec : public boost::array<N, C> {
// ...
public:
template <typename N2>
explicit Vec(N2 const & v) {
vec_assignation_trait<
boost::is_arithmetic::assign(*this, v);
}
};

//... idem pour Vec3 et Vec4

xavier
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.