Я пишу некоторый код C ++, который оборачивает тип std :: unordered_map, где я хочу скрыть базовый тип и представить его как другой тип. Более конкретно, я хочу обернуть std :: pair из std :: unordered_map другим типом. Ради аргумента, давайте предположим, что оболочка выглядит следующим образом ...
template <typename ActualT >
class wrapper final
{
private:
ActualT actual_;
public:
//Some constructors...
typename ActualT::first_type & get_first()
{
return actual_.first;
}
typename ActualT::second_type & get_second()
{
return actual_.second;
}
};
Мое рассуждение состоит в том, что, поскольку у класса-обертки есть только член, который является точным типом, который он переносит, преобразование ссылки из исходного типа в тип обертки должно быть в порядке, но совместимость типов для структур гласит, что члены должен иметь одинаковый тип и имя для совместимости типов. Может ли использование подобного типа вызывать неопределенное поведение или проблемы с выравниванием?
using my_map = std::unordered_map < int, int >;
my_map m;
//Do some inserts...
reinterpret_cast<wrapper<typename my_map::value_type>&>(*m.find(10)).get_second() = 1.0;
Я хочу, чтобы клиентскому коду был разрешен доступ к записям карты, не зная о паре, возвращаемой картой. Я также хочу написать пользовательский прямой итератор, поэтому мне нужно вернуть ссылку на запись. Будет ли преобразование ссылки на пару в ссылку на класс, который действует как обертка, считаться опасным?
Возможно, есть лучший подход для достижения этой цели?