Comment puis-je forcer une instance particulière d’un modèle C ++ à instancier?

Voir le titre. J’ai un template Je veux forcer une instance particulière d’un modèle à instancier. Comment puis-je faire cela?

Plus précisément, pouvez-vous forcer une classe de modèle abstraite à instancier?


Je pourrais élaborer comme j’ai la même question. Dans mon cas, je construis une bibliothèque, certaines implémentations de gabarits sont volumineuses et contiennent beaucoup de choses, mais elles ne sont générées que pour quelques types. Je veux les comstackr dans la bibliothèque et exporter toutes les méthodes, mais ne pas inclure l’en-tête avec le code partout.

c’est à dire:

template OS_EXPORT_DECL class MyTmpl { T *item1; public: inline T *simpleGetT() { return(item1); } /* small inline code in here */ } T *doSomeReallyBigMergeStuff(T *b); // note only declaration here }; // *** implementation source file only seen inside library template MyTmpl::doSomeReallyBigMergeStuff(T *b) { ... a really big method, but don't want to duplicate it, so it is a template ... } 

Je pourrais bien sûr référencer toutes les méthodes de la bibliothèque qui les forceraient à comstackr et à exporter, mais le désir n’est pas d’append du code inutile à la bibliothèque, comme le format d’argument des éléments et le code pour les appeler.

????? Plus précisément, je construis la bibliothèque pour plusieurs versions de MSC et GCC et compilateurs Intel.

Vous ne pouvez pas forcer les modèles génériques à instancier, le compilateur ne peut générer du code que si le type est complètement connu.

Forcer une instanciation se fait en fournissant explicitement tous les types:

 template class std::vector; 

Comeaus template FAQ couvre les problèmes liés de manière détaillée.

Ce que vous pouvez également essayer est une instanciation explicite:

 template class vector; // class template int& vector::operator[](int); // member template int convert(double); // function 

Vous pouvez forcer l’instanciation en utilisant le modèle avec le paramètre souhaité. Par exemple, vous pouvez définir une fonction en utilisant toutes les méthodes requirejses:

 void force_int_instance() { Abstract *a; a->some_method(); a->some_other_method(1, 2, 3); } 

Vous n’avez pas besoin d’appeler cette fonction n’importe où, ce n’est donc pas un problème que le pointeur ne soit pas initialisé. Mais le compilateur doit supposer que la fonction peut être appelée à partir d’un autre fichier object, elle doit donc instancier le modèle.

Si je comprends bien votre question, vous avez une classe de modèle et vous voulez forcer le compilateur à générer le code à utiliser avec un type spécifique. Par exemple, vous souhaiterez peut-être vous assurer que le code de std :: vector existe dans votre programme.

La meilleure façon de s’assurer de cela est de simplement construire une instance de la classe:

 void EnsureInstantiation() { std::vector intvector; std::vector boolvector; /// etc. } 

L’astuce est que vous n’avez même pas besoin d’appeler EnsureInstantiation dans votre code. Assurez-vous simplement que ce n’est pas statique ou que le compilateur peut l’ optimiser.

la classe abstraite ne peut pas être instanciée.Vous voulez probablement faire quelque chose comme:

 Abstract *a = new Implementation(...); 

Pour forcer l’instanciation du modèle, appelez le modèle avec les parameters du modèle:

 std::max(...); std::pair(...); 

Je vais répondre à ce que je pense que vous vouliez dire, pas à ce que vous avez dit.

Je suppose que le problème est l’une des deux choses. La première est que vous avez du code dans un modèle qui n’est pas compilé lorsque vous comstackz le fichier de modèle lui-même, ce qui peut être très ennuyeux. Cela peut être corrigé dans vos parameters de compilateur.

L’autre est que vous voulez avoir quelque chose de spécial pour un type particulier, peut-être pour le déboguer. Cela s’appelle l’instanciation explicite mais n’instancie pas vraiment quoi que ce soit pour s’assurer qu’il est toujours défini après ce point.

http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/topic/com.ibm.vacpp6m.doc/language/ref/clrc16explicit_instantiation.htm