combiner instantiation explicite et « extern template »
1 réponse
fabien.chene
Bonjour,
Le code ci dessous offre la possibilité d'instancier explicitement le
template Foo<int>, ou au contraire de dire au compilateur, via extern
template, que Foo<int> ne doit pas être instancié (je ne sais
d'ailleurs pas si c'est une obligation pour le compilateur, selon
C++0x).
Je trouve l'idée intéressante, mais une chose me dérange.
La classe mise pour Foo<int> dans mon propre code, est typiquement
bien grasse, lourde à taper. Pour faciliter la maintenance, je défini
une macro pour être bien sûr de recopier le bon type à l'identique.
C'est cette macro qui ne me plait guère (TYPE) -- elle apparait dans
mon code sur de nombreuses lignes, et je la trouve donc assez laide,
question de goût :-/
Voyez-vous une autre solution ?
Je n'en vois pas d'autres vu que template doit être suivi d'une
déclaration. Un typedef ne fera donc pas l'affaire.
Bref, je trouve qu'il manque un peu de sucre syntaxique pour rendre
cette pratique -- combiner instantiation explicite et « extern
template » -- élégante.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
fabien.chene
(Fabien Chêne) writes:
Le code ci dessous offre la possibilité d'instancier explicitement le template Foo<int>, ou au contraire de dire au compilateur, via extern template, que Foo<int> ne doit pas être instancié (je ne sais d'ailleurs pas si c'est une obligation pour le compilateur, selon C++0x).
Je trouve l'idée intéressante, mais une chose me dérange. La classe mise pour Foo<int> dans mon propre code, est typiquement bien grasse, lourde à taper. Pour faciliter la maintenance, je défini une macro pour être bien sûr de recopier le bon type à l'identique. C'est cette macro qui ne me plait guère (TYPE) -- elle apparait dans mon code sur de nombreuses lignes, et je la trouve donc assez laide, question de goût :-/
Bon, j'ai statué sur le sort de ce code. La définition de la macro est horrible, complique la lecture puisque c'est ici le seul endroit où l'on peut savoir ce que va faire le code, mais ça me parait être la seule solution ... (je fais bien un typedef sur la macro TYPE pour l'utiliser dans le code qui inclu ce fichier).
Voyez-vous une autre solution ? Je n'en vois pas d'autres vu que template doit être suivi d'une déclaration. Un typedef ne fera donc pas l'affaire. Bref, je trouve qu'il manque un peu de sucre syntaxique pour rendre cette pratique -- combiner instantiation explicite et « extern template » -- élégante.
En fait, j'ai besoin d'instancier explicitement (ou pas) des fonctions membres template de cette classe template.
EXTERN_OR_NOTHING template void TYPE ::f( int );
Et cette écriture me parait en revanche le mieux que je puisse faire.
-- Fab
fabien.chene@gmail.com (Fabien Chêne) writes:
Le code ci dessous offre la possibilité d'instancier explicitement le
template Foo<int>, ou au contraire de dire au compilateur, via extern
template, que Foo<int> ne doit pas être instancié (je ne sais
d'ailleurs pas si c'est une obligation pour le compilateur, selon
C++0x).
Je trouve l'idée intéressante, mais une chose me dérange.
La classe mise pour Foo<int> dans mon propre code, est typiquement
bien grasse, lourde à taper. Pour faciliter la maintenance, je défini
une macro pour être bien sûr de recopier le bon type à l'identique.
C'est cette macro qui ne me plait guère (TYPE) -- elle apparait dans
mon code sur de nombreuses lignes, et je la trouve donc assez laide,
question de goût :-/
Bon, j'ai statué sur le sort de ce code. La définition de la macro est
horrible, complique la lecture puisque c'est ici le seul endroit où
l'on peut savoir ce que va faire le code, mais ça me parait être la
seule solution ...
(je fais bien un typedef sur la macro TYPE pour l'utiliser dans le
code qui inclu ce fichier).
Voyez-vous une autre solution ?
Je n'en vois pas d'autres vu que template doit être suivi d'une
déclaration. Un typedef ne fera donc pas l'affaire.
Bref, je trouve qu'il manque un peu de sucre syntaxique pour rendre
cette pratique -- combiner instantiation explicite et « extern
template » -- élégante.
En fait, j'ai besoin d'instancier explicitement (ou pas) des fonctions
membres template de cette classe template.
EXTERN_OR_NOTHING template void TYPE ::f( int );
Et cette écriture me parait en revanche le mieux que je puisse faire.
Le code ci dessous offre la possibilité d'instancier explicitement le template Foo<int>, ou au contraire de dire au compilateur, via extern template, que Foo<int> ne doit pas être instancié (je ne sais d'ailleurs pas si c'est une obligation pour le compilateur, selon C++0x).
Je trouve l'idée intéressante, mais une chose me dérange. La classe mise pour Foo<int> dans mon propre code, est typiquement bien grasse, lourde à taper. Pour faciliter la maintenance, je défini une macro pour être bien sûr de recopier le bon type à l'identique. C'est cette macro qui ne me plait guère (TYPE) -- elle apparait dans mon code sur de nombreuses lignes, et je la trouve donc assez laide, question de goût :-/
Bon, j'ai statué sur le sort de ce code. La définition de la macro est horrible, complique la lecture puisque c'est ici le seul endroit où l'on peut savoir ce que va faire le code, mais ça me parait être la seule solution ... (je fais bien un typedef sur la macro TYPE pour l'utiliser dans le code qui inclu ce fichier).
Voyez-vous une autre solution ? Je n'en vois pas d'autres vu que template doit être suivi d'une déclaration. Un typedef ne fera donc pas l'affaire. Bref, je trouve qu'il manque un peu de sucre syntaxique pour rendre cette pratique -- combiner instantiation explicite et « extern template » -- élégante.
En fait, j'ai besoin d'instancier explicitement (ou pas) des fonctions membres template de cette classe template.
EXTERN_OR_NOTHING template void TYPE ::f( int );
Et cette écriture me parait en revanche le mieux que je puisse faire.