Редактировать: Я нашел и написал решение своей проблемы, но оставил вопрос без ответа, поскольку мое решение все еще может быть не идеальным.
Я пишунебольшая библиотека, предназначенная для выполнения подпрограмм на картах карт, но у меня возникают проблемы при разработке набора шаблонов классов, которые позволят мне получить указатель или ссылку (в зависимости от second_type для value_type карты) на mapped_type карты, независимо оттип карты (например, std :: map, boost :: ptr_map).
Для более подробного описания я перечислил некоторые типы ввода и нужные типы вывода.
Case Input Type Output Type
A std::map<int, std::map<int, int> > std::map<int, int>&
B std::map<int, boost::ptr_map<int, int> > boost::ptr_map<int, int>&
C boost::ptr_map<int, std::map<int, int> > std::map<int, int>* const
D std::map<int, std::map<int, int> >* std::map<int, int>&
E std::map<int, boost::ptr_map<int, int> >* boost::ptr_map<int, int>&
F boost::ptr_map<int, std::map<int, int> >* std::map<int, int>* const
Мой кодпропускает случаи A, B, D и E, но терпит неудачу в случаях C и F. Вот что я имею до сих пор.
template <class Map>
struct map_utils
{
template <class K>
static typename
boost::remove_pointer<
typename Map::value_type
>::type::second_type&
get(Map& m, const K k)
{
return m[k];
}
template <class K>
static typename
boost::remove_pointer<
typename Map::value_type
>::type::second_type&
get(const Map& m, const K k)
{
return const_cast<Map&>(m)[k];
}
};
template <class Map>
struct map_utils<Map*>
{
template <class T>
static typename
boost::remove_pointer<
typename Map::value_type
>::type::second_type&
get(Map* m, const T t)
{
return (*m)[t];
}
template <class T>
static typename
boost::remove_pointer<
typename Map::value_type
>::type::second_type&
get(const Map* m, const T t)
{
return const_cast<Map*>(m)->operator[](t);
}
};
Я пытаюсь использовать для этого boost :: mpl, иэто то, что я до сих пор готовил, но я получаю одну и ту же ошибку, используя обе версии кода.
Ошибка.
error: invalid initialization of reference of type ‘std::map<int, double>* const&’ from expression of type ‘boost::ptr_container_detail::reversible_ptr_container<boost::ptr_container_detail::map_config<std::map<int, double>, std::map<int, void*, std::less<int>, std::allocator<std::pair<const int, void*> > >, true>, boost::heap_clone_allocator>::Ty_’
Измененная специализация структуры для обработкис l-значениями, которые не являются указателями на карты.
template <class K>
static typename
boost::mpl::if_<
boost::is_pointer<
typename boost::remove_pointer<
typename Map::value_type
>::type::second_type
>,
typename boost::remove_pointer<
typename boost::remove_const<
typename Map::value_type
>::type
>::type::second_type,
typename boost::remove_pointer<
typename Map::value_type
>::type::second_type&
>::type
get(Map& m, const K k)
{
return m[k];
}