7

所以我有一个模板类,我想接受一个std::map,其中数据类型是原始指针或std::unique_ptr。然后在这个类中,我想获取底层指针的类型:

typedef typename boost::mpl::if_<
    boost::is_pointer<typename Container::mapped_type>,
    typename Container::mapped_type,
    typename Container::mapped_type::element_type*
>::type data_type

但是,在使用具有原始指针类型的映射实例化类时出现以下错误:

error: 'std::map<int, ValueType*>::mapped_type {aka ValueType*}' is not a class, struct, or union type

在我看来,它正在评估typename Container::mapped_type::element_type*原始指针,我认为使用模板元编程它不会在 if_ 成功时评估它。我应该以不同的方式解决这个问题吗?

4

1 回答 1

11

You need a lazy if – try boost::mpl::eval_if instead of boost::mpl::if_:

#include <boost/type_traits/is_pointer.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>

template<typename T>
struct extract_element_type
{
    typedef typename T::element_type* type;
};

template<typename Container>
struct foo
{
    typedef typename boost::mpl::eval_if<
        boost::is_pointer<typename Container::mapped_type>,
        boost::mpl::identity<typename Container::mapped_type>,
        extract_element_type<typename Container::mapped_type>
    >::type data_type;
};

I.e., when in doubt, add an extra layer of indirection.

于 2012-05-24T23:48:01.733 回答