В шаблоне класса Foo
Я хочу проверить, предоставляет ли параметр шаблона тип с именем Bar
.
struct TypeA {using Bar = int;};
struct TypeB {};
template<class T>Foo{};
void main(){
Foo<TypeA> a; // I want this to compile
Foo<TypeB> b; // I want this to not compile, but print a nice message.
}
Поскольку я хочу объединить это с другими свойствами, я хочу hasBar
metafunction.Поэтому я могу объединить логические значения и затем использовать std::enable_if
.
Я пытался понять и использовать SFINAE, но не смог:
template<class T, class Enable = void>struct hasBar : std::false_type {};
template<class T>
struct hasBar<T,decltype(std::declval<T::Bar>(),void())> : std::true_type {};
hasBar<TypeA>::value
всегда ложно.
Как правильно определить hasBar
?
Или есть какой-то лучший подход, чем using
, к наличию бара?