GOOGLE ADS

samedi 30 avril 2022

Comment avoir une instanciation de modèle de fonction spécifique à TU ?

Disons:


  • Certains en-têtes h.hppdéfinissent une fonction de modèle en f()utilisant sizeofson paramètre de modèle.

  • Deux fichiers source C++ différents, a.cppet b.cpp, définissent leur propre structure portant le même nom S.

  • Les deux a.cppet b.cpputiliser f()avec leurs propres S.


En d'autres termes:

h.hpp:

template <typename T>
int f()
{
return something + sizeof(T);
}

a.cpp:

#include "h.hpp"
struct S {
int a;
int b;
};
int aFunc()
{
return f<S>();
}

b.cpp:

#include "h.hpp"
struct S {
int w;
int x;
int y;
int z;
};
int bFunc()
{
return f<S>();
}

Ici, dans le même programme, les deux aFunc()et bFunc()renvoient la même valeur. En effet, les deux structures sont nommées Set une seule instanciation de fonction modèle est conservée.

Mes solutions de travail jusqu'à présent sont:

  • Nommez les structures différemment.

  • Faire f() static.

  • Faire f()partie d'un espace de noms anonyme.

  • Intégrez les deux structures à leur propre espace de noms anonyme.

  • Pouvez-vous penser à autre chose pour éviter ce problème qui ne se manifeste qu'au moment de l'exécution ?


    Solution du problème

    Si vous ne vous souciez que de la taille de S, vous pouvez l'envelopper dans un type au nom unique qui a la même taille que S, par exemple un lambda (de capture):

    // a.cpp
    void aFunc()
    {
    static auto const l = [s=S{}] {};
    f<decltype(l)>();
    }
    // b.cpp
    void bFunc()
    {
    static auto const l = [s=S{}] {};
    f<decltype(l)>();
    }

    Je crois que cette solution est pire que les quatre que vous proposez mais accomplit ce que vous voulez. Ma solution préférée serait:

  • Intégrez les deux structures à leur propre espace de noms anonyme.
  • Aucun commentaire:

    Enregistrer un commentaire

    Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

    Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...