Disons:
- Certains en-têtes
h.hppdéfinissent une fonction de modèle enf()utilisantsizeofson paramètre de modèle. - Deux fichiers source C++ différents,
a.cppetb.cpp, définissent leur propre structure portant le même nomS. - Les deux
a.cppetb.cpputiliserf()avec leurs propresS.
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:
f() static.f()partie d'un 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:
Aucun commentaire:
Enregistrer un commentaire