我想写这样的东西:

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中未定义MyType时,GCC(4.8.4)仍然提示使用T。有办法解决吗?

最佳答案

template <typename...>
struct voider { using type = void; };

template <typename... Ts>
using void_t = typename voider<Ts...>::type;

template <typename, typename = void_t<>>
struct MyTypeOrTupple { using type = std::tuple<>; };

template <typename T>
struct MyTypeOrTupple<T, void_t<typename T::MyType>> { using type = typename T::MyType; };

template <typename T>
using MyTypeOrTupple_t = typename MyTypeOrTupple<T>::type;

DEMO

关于c++ - 如何在C++ 11中访问可能不存在的类型别名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32007938/

10-11 22:56
查看更多