Hello,
Soit la classe :
Serait-il possible de faire varier la nature constante du membre selon le type T ?Code:
1
2
3
4
5 template <class T> struct MaClasse { const long monMembre; // on ne rit pas }
Version imprimable
Hello,
Soit la classe :
Serait-il possible de faire varier la nature constante du membre selon le type T ?Code:
1
2
3
4
5 template <class T> struct MaClasse { const long monMembre; // on ne rit pas }
Bonjour,
Je ne suis pas sur de comprendre, mais peut-être avec une liste "Type to type", du style:
Remarque : "typename I" peut aussi être remplacer par un bool, comme ça la constance peut être conditionnelle, plutôt que dépendante d'un type.Code:
1
2
3
4
5
6
7
8
9
10
11 template<typename I> struct MyTypeOf { typedef long Type; //Par défaut tout les type sont associé a long }; template<> struct MyTypeOf<UnTypeParticulier> { typedef long const Type; //Ce type est associé a long const };
C'est pas très clair je pense, alors voila une meilleur explication:
http://cpp.developpez.com/faq/cpp/?p...S_classe_trait
http://alp.developpez.com/tutoriels/traitspolicies/
Et en compilant les 2 idées, on peut avoir quelque chose comme ça:
qui devrait fonctionner.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 template<typename T> struct Type {}; template<> struct Type<int> { int member; }; template<> struct Type<long> { const int member; } //.. plus de spécialisation template< typename T > struct MyClass { Type<T> myType; };
Edit:
ou alors tu parles de virer ou non le const selon le type ?
Dans ce cas, il s'agit juste de la spécialisation.
Code:
1
2
3
4 template<typename T> struct MyClass { const long member; }; template<> struct MyClass<int> { long member; };
Tu veux dire faire quelque chose comme ça ?
EDIT : oh, les gros fail que je fais...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 template <class T> struct MaClasse { const long monMembre = 0; // on ne rit pas }; template <> struct MaClasse<int> { long monMembre = 0; // on ne rit pas }; MaClasse<double> d; d.monMembre = 10; // erreur : membre const MaClasse<int> i; i.monMembre = 10; // ok
J'avais pensé à ça, mais c'était la solution que je voulais éviter.
Je pensais plus à quelque chose au niveau de la définition du membre.
Je pense que c'est possible, mais plus j'y réfléchis, plus je me dis que ça sera gourmand à la compilation (il y a en fait 10 à 15 membres, et une trentaine de classes).
Je pensais plus à un truc comme ça.
Mais sans Boost. :)
Ca revient au même
EDIT : tu as aussi les std::remove_const ou équivalent de type_traits, il y a peut être un qui correspond à ce que tu recherches ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class no_const_tag {}; class const_tag {}; template <class T = no_const_tag> struct MaClasse { long monMembre = 0; // on ne rit pas }; template <> struct MaClasse<const_tag> { const long monMembre = 0; // on ne rit pas }; MaClassed; d.monMembre = 10; // erreur : membre const MaClasse<const_tag > i; i.monMembre = 10; // ok
Bon, en fait, les classes correspondent à des tables SQL, et les membres à des colonnes.
Il y a ensuite une moulinette qui convertit tout ça en code C++ (définitions de classes).
Il faut d'abord que je voie si je peux récupérer définir ces informations de constances sous formes de métadonnées des colonnes SQL.
J'ai mis la charrue avant les bœufs. Désolé.
Je vais mettre le fil en Résolu pour l'instant.
J'ai trouvé dans C++11 add_const (issu de <type_traits>), mais j'ai du mal à trouver le moindre exemple de code...
Par exemple :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <type_traits> template <class T> struct MaClasse { typename std::conditional<std::is_signed<T>::value, std::add_const<long>::type, long>::type monMembre; }; int main() { //MaClasse<signed int> m1; //ne compile pas car type signé donc monMembre est const MaClasse<unsigned int> m2; }
Mis à part qu'il faudrait que j'utilise un enum comme condition, c'est exactement ce qu'il me faut.
Merci.