次のコンパイル時の「トリック」(ADL に基づく) を使用して、同じ名前空間内のクラスによってのみ有効/定義/呼び出し可能な関数を作成しています。
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
Foo::Bar
ここで、この原則 (または同様のもの) を使用して、各名前空間に属するクラス (以下)の特殊化を生成したいと思います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 ){}
};
保守を容易にし、各名前空間に多数のクラスがあるため、可能であれば、名前空間内のすべてのクラスに名前を付けずにこのチェックを実行したいと考えています。