gri*_*ett 7 c++ boost boost-mpl template-meta-programming
所以我有一个模板类,我想接受一个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
Run Code Online (Sandbox Code Playgroud)
但是,当使用具有原始指针类型的映射实例化类时,我收到以下错误:
error: 'std::map<int, ValueType*>::mapped_type {aka ValueType*}' is not a class, struct, or union type
Run Code Online (Sandbox Code Playgroud)
在我看来它正在评估typename Container::mapped_type::element_type*原始指针,我认为使用模板元编程它不会评估当if_成功时.我应该采取不同的方式吗?
ild*_*arn 11
你需要一个懒惰 if - 尝试boost::mpl::eval_if而不是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;
};
Run Code Online (Sandbox Code Playgroud)
即,如有疑问,请添加一个额外的间接层.