我想写这样的东西:
template <class T>
using MyTypeOrTupple = typename std::conditional<has_member_type_MyType<T>::value,
typename T::MyType,
std::tuple<> >::type;
我使用 https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector 实现了 has_member_type_MyType
但是,当 T
中未定义 MyType
时,GCC (4.8.4) 仍然提示使用 T::MyType
。有办法解决吗?
最佳答案
不要使用维基教科书中的那些疯狂的东西。
template <class T>
using MyType_t = typename T::MyType;
template<class T>
using MyTypeOrTuple = detected_or_t<std::tuple<>, MyType_t, T>;
detected_or_t
是 std::experimental::detected_or_t
来自 library fundamentals TS v2,可以按如下方式实现:
namespace detail {
template<class...> struct voidify { using type = void; };
template<class...Ts> using void_t = typename voidify<Ts...>::type;
template <class Default, class AlwaysVoid,
template<class...> class Op, class... Args>
struct detector {
using value_t = std::false_type;
using type = Default;
};
template <class Default, template<class...> class Op, class... Args>
struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
using value_t = std::true_type;
using type = Op<Args...>;
};
} // namespace detail
template <class Default, template<class...> class Op, class... Args>
using detected_or = detail::detector<Default, void, Op, Args...>;
template< class Default, template<class...> class Op, class... Args >
using detected_or_t = typename detected_or<Default, Op, Args...>::type;
关于c++ - 如何访问 C++11 中可能不存在的类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007938/