Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

combiner instantiation explicite et « extern template »

1 réponse
Avatar
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).

//------------------- test.hpp -----------------
#ifndef TEST_H
#define TEST_H

template <class T> class Foo {};

#define TYPE Foo<int>


#ifdef EXPLICIT_INSTANTIATION
# define EXTERN_OR_NOTHING
#else
# define EXTERN_OR_NOTHING extern
#endif


EXTERN_OR_NOTHING template class TYPE ;

#endif
//-----------------------------------------------

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.


--
Fab

1 réponse

Avatar
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).

//------------------- test.hpp -----------------
#ifndef TEST_H
#define TEST_H

template <class T> class Foo {};

#define TYPE Foo<int>


#ifdef EXPLICIT_INSTANTIATION
# define EXTERN_OR_NOTHING
#else
# define EXTERN_OR_NOTHING extern
#endif


EXTERN_OR_NOTHING template class TYPE ;

#endif
//-----------------------------------------------

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