c++ - 基于嵌套 typedef 的存在的类型决定

标签 c++ templates metaprogramming

我需要定义一个模板结构:

element<T>::type

是类型:

T::element_type 

如果 T 包含一个名为 element_type 的(公共(public))typedef,否则(如果它不包含这样的 typedef)

element<T>::type

是类型

T::value_type 

如果 T 是可变的并且是类型

const T::value_type

如果 T 是常量。

我真的很纠结这个,非常感谢任何建议! :)

非常感谢您的提前帮助!

最佳答案

也许是这样的:

template <typename T>
struct has_element_type
{
    typedef char yes[1];
    typedef char no[2];

    template <typename C>
    static yes& test(typename C::element_type*);

    template <typename>
    static no& test(...);

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

template <typename T>
struct is_const
{
    static const bool value = false;
};


template <typename T>
struct is_const<const T>
{
    static const bool value = true;
};

template <typename, bool> // true -> const
struct value_type_switch; 

template <typename T>
struct value_type_switch<T, true>
{
    typedef const typename T::value_type type;
};

template <typename T>
struct value_type_switch<T, false>
{
    typedef typename T::value_type type;
};

template <typename, bool> // true -> has element_type
struct element_type_switch;

template <typename T>
struct element_type_switch<T, true>
{
    typedef typename T::element_type type;
};


template <typename T>
struct element_type_switch<T, false>
{
    typedef typename value_type_switch<T, is_const<T>::value>::type type;
};

template <typename T>
struct element
{
    typedef typename element_type_switch<T,
                                    has_element_type<T>::value>::type type;
};

这当然应该拆分和组织。

关于c++ - 基于嵌套 typedef 的存在的类型决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980879/

相关文章:

c++ - 结构 ifreq : different definition in "linux/if.h" and man page

android - 确定套接字何时在 Android 上关闭

c++ - 到处使用策略而不是条件是否值得(将运行时检查转为编译时)?

automation - Petri网绘图和代码生成

c++ - 关于使用用户定义方法扩展 C++ STL 容器的更好方法的建议

java - 将 C++ 内存排序映射到 Java

Django - 过滤模板中的RelatedManager _set?

c++ - 在析构函数中删除 []

c++ - 模板元编程 : Problems with Partial Specialization

ruby - 如何使用 Ruby 创建类似 ".find_by_something_and_something_else"的方法?