c++ - 如何访问 C++11 中可能不存在的类型别名?

标签 c++ templates c++11

我想写这样的东西:

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_tstd::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/

相关文章:

c++ - Eclipse C++ 调试在 STL 中中断

C++ 在 Windows 中编译,在 Linux 中出现多重定义错误

c++ - 这是部分功能模板特化吗?

c# - 如何在不混淆 Razor 引擎的情况下正确呈现变量?

c++ - OpenSSL 解密 - EVP_DecryptFinal_ex 失败

c++ - 有什么方法可以将 static_assert 放入 ISO C++11 中的表达式中?

C++使用宏定义单个类的类成员

c++ - 你如何抽象接口(interface)类

email - 如何在 salesforce.com 中配置有关新案例评论的电子邮件通知?

c++ - 成员函数指针转换,从 Derived 到 Base 类