考虑以下:
struct A {
typedef int foo;
};
struct B {};
template<class T, bool has_foo = /* ??? */>
struct C {};
我想根据类型名 T::foo 的存在与否来特化 C,以便 C<A> 获得一种特化,而 C<B> 获得另一种特化。这可能使用类型特征或其他一些模板魔法吗?
问题是我在实例化 C<B> 时尝试的所有操作都会产生编译错误,因为 B::foo 不存在。但这就是我想要测试的!
编辑:我认为 ildjarn 的答案更好,但我最终想出了以下 C++11 解决方案。伙计,它很老套,但至少它很短。:)
template<class T>
constexpr typename T::foo* has_foo(T*) {
return (typename T::foo*) 1;
}
constexpr bool has_foo(...) {
return false;
}
template<class T, bool has_foo = (bool) has_foo((T*)0)>