Estoy usando el siguiente 'truco' en tiempo de compilación (basado en ADL) para crear una función que sea válida/definida/invocable solo por clases en el mismo espacio de nombres.Especializando una plantilla de método para clases en un espacio de nombres
namespace Family1
{
struct ModelA{};
struct ModelB{};
template<typename T>
bool is_in_Family1(T const& t)
{
return true;
}
};
namespace Family2
{
struct ModelC{};
template<typename T>
bool is_in_Family2(T const& t)
{
return true;
}
};
Family1::ModelA mA;
Family2::ModelC mC;
is_in_Family1(mA); // VALID
is_in_Family1(mC); // ERROR
Ahora, me gustaría utilizar este principio (o algo similar) con el fin de producir una especialización de Foo::Bar
(abajo) para las clases que pertenecen a cada uno de los espacios de nombres, por ejemplo, Family1
.
// I would like to specialize the method template Bar for classes in Family1
// namespace; and another specialization for classes in Family2 namespace
struct Foo
{
template<typename T>
void Bar(T& _T){}
};
Para facilitar el mantenimiento y el gran número de clases en cada espacio de nombres, si es posible, me gustaría realizar esta comprobación sin nombrar a todas las clases en un espacio de nombres.
¿Por qué 'Foo' es una clase de plantilla cuyo constructor también es una plantilla con un tipo diferente? 'Foo myvar ('4');'? ¿Solo quisiste tener una 'plantilla '? Porque el exterior no se usa. Creo que esto podría hacerse si 'Foo' fuera solo una función, pero no creo que pueda ser para una estructura. O al menos, no muy bien. –