Assume I have several classes with the same name in different namespaces.
namespace A { class Foo { ... }; }
namespace B { class Foo { ... }; }
namespace C { class Foo { ... }; }
I'd like to detect in compile-time if class named Foo despite namespace. For example some SFINAE class,
template <typename T> struct is_Foo {
static const bool value = /* some magic here */;
};
Then I want is_Foo<A::Foo>::value was true, is_Foo<B::Foo>::value was true and is_Foo<A::Bar>::value was false.
Then, I'd like to use is_Foo in static_assert or std::enable_if. Is it possible?
template <typename T>
struct is_Foo : public std::false_type {
};
template <>
struct is_Foo<A::Foo> : public std::true_type {
};
template <>
struct is_Foo<B::Foo> : public std::true_type {
};
template <>
struct is_Foo<C::Foo> : public std::true_type {
};
This works by making is_Foo<T> inherit from std::true_type for specializations of the T as A::Foo etc. and inherit from std::false_type for any other T. As you can see no SFINAE is used, just inheritance and template specialization.
This can be used for static_assert and enable_if.
If you don't want to specialize is_Foo for every class, you must make the classes 'cooperate', as suggested in the comments. One way of doing that is create a class and make all those classes inherit that class. That class can have either a special member you could check for or just you could check if T is_base_of that class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With