Disons:
- Certains en-têtes
h.hpp
définissent une fonction de modèle enf()
utilisantsizeof
son paramètre de modèle. - Deux fichiers source C++ différents,
a.cpp
etb.cpp
, définissent leur propre structure portant le même nomS
. - Les deux
a.cpp
etb.cpp
utiliserf()
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 S
et 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