web-dev-qa-db-fra.com

Comment forcer une instance particulière d'un modèle C++ à instancier?

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

Plus spécifiquement, pouvez-vous forcer une classe de modèle abstrait à instancier?


Je pourrais élaborer car j'ai la même question. Dans mon cas, je construis une bibliothèque, certaines implémentations de modèles sont volumineuses et incluent beaucoup de choses, mais elles ne sont générées que pour quelques types. Je veux les compiler 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<class T>
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<class T>
MyTmpl<T>::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 obligeraient à compiler et à exporter, mais le souhait n'est pas d'ajouter à la bibliothèque un code inutile, comme le formatage des arguments pour les éléments et le code pour les appeler, etc.

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

46
anon

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.

Le forçage d'une instanciation est effectué en fournissant explicitement tous les types:

template class std::vector<int>;

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

51
Georg Fritzsche

Vous pouvez également essayer une instanciation explicite:

template class vector<int>;                    // class
template int& vector<int>::operator[](int);    // member
template int convert<int,double>(double);      // function
42
Alexander Poluektov

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 requises:

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

Il n'est pas nécessaire d'appeler cette fonction nulle part. Le problème est donc que le pointeur ne soit pas initialisé. Mais le compilateur doit supposer que la fonction peut être appelée à partir d'un autre fichier objet, il doit donc instancier le modèle.

1
sth

Si je comprends bien votre question, vous avez une classe de modèle et vous souhaitez forcer le compilateur à générer le code à utiliser avec un type spécifique. Par exemple, vous pouvez vouloir vous assurer que le code pour std :: vector <int> existe dans votre programme.

Le meilleur moyen de s'en assurer est de simplement construire une instance de la classe:

void EnsureInstantiation()
{
    std::vector<int> intvector;
    std::vector<boo> boolvector;
    /// etc.
}

Le truc, c'est que vous n'avez même pas à appeler EnsureInstantiation dans votre code. Assurez-vous simplement que ce n'est pas statique ou que le compilateur peut / l'optimise.

0
Anton