获取dereferencable类型的value_type

ron*_*nag 3 c++ visual-studio-2010 type-traits template-meta-programming c++11

我如何为任何derefernable类型实现以下?

我发现我当前的解决方案缺乏,因为我需要为我希望它使用的每种类型执行类模板特化:

template<typename T>
struct get_value_type
{
    typedef typename T::value_type value_type;
};

template<typename E>
struct get_value_type<std::unique_ptr<E>>
{
    typedef typename E::value_type value_type;
};  

template<typename E>
struct get_value_type<std::shared_ptr<E>>
{
    typedef typename E::value_type value_type;
};  

template<typename E>
struct get_value_type<boost::optional<E>>
{
    typedef typename E::value_type value_type;
};
Run Code Online (Sandbox Code Playgroud)

我尝试了一些方法,但是没有用.

template<typename T, typename IsIndirect = false_type>
get_value_type
{
    typedef typename T::value_type value_type;     
}

template<typename T>
struct get_value_type<T, true_type>
{
     typedef decltype(*boost::declval<E>())::value_type value_type; 
};

typedef get_value_type<T, is_indirect<T>::type> value_type;
Run Code Online (Sandbox Code Playgroud)

How*_*ant 7

你正在寻找std::pointer_traits<PointerType>::element_type生活在哪里的人<memory>.

#include <memory>
#include <boost/optional.hpp>

template <class Ptr>
struct MyPointer
{
};

template <class Ptr>
struct YourPointer
{
    typedef signed char element_type;
};

int main()
{
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<std::unique_ptr<double>>::element_type,
            double
        >::value,
        ""
    );
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<std::unique_ptr<short[]>>::element_type,
            short
        >::value,
        ""
    );
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<std::shared_ptr<const char>>::element_type,
            const char
        >::value,
        ""
    );
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<boost::optional<int*>>::element_type,
            int*
        >::value,
        ""
    );
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<MyPointer<long long>>::element_type,
            long long
        >::value,
        ""
    );
    static_assert
    (
        std::is_same
        <
            std::pointer_traits<YourPointer<long long>>::element_type,
            signed char
        >::value,
        ""
    );
}
Run Code Online (Sandbox Code Playgroud)

20.6.3.1指针特征成员类型[pointer.traits.types]

typedef 见下文 element_type ;

输入: Ptr::element_type如果存在这样的类型; 否则,Tif Ptr是表单的模板实例化SomePointer<T, Args>,其中Args是零个或多个类型参数; 否则,专业化是不正确的.

哦,还有指针类型的专门化:

template <class T>
struct pointer_traits<T*>
{
    typedef T*        pointer;
    typedef T         element_type;
    typedef ptrdiff_t difference_type;

    template <class U> using rebind = U*;

    static pointer pointer_to(see below r) noexcept;
};
Run Code Online (Sandbox Code Playgroud)