基于嵌套typedef的存在来键入决策

Ste*_*phQ 7 c++ templates metaprogramming

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

element<T>::type
Run Code Online (Sandbox Code Playgroud)

是类型:

T::element_type 
Run Code Online (Sandbox Code Playgroud)

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

element<T>::type
Run Code Online (Sandbox Code Playgroud)

是类型的

T::value_type 
Run Code Online (Sandbox Code Playgroud)

如果T是可变的和类型

const T::value_type
Run Code Online (Sandbox Code Playgroud)

如果T是常数.

我真的很挣钱,任何建议都非常感谢!:)

非常感谢您的帮助!

GMa*_*ckG 4

也许是这样的:

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;
};
Run Code Online (Sandbox Code Playgroud)

这当然应该分开并组织起来。