Enum <-> функции отображения строки - PullRequest
1 голос
/ 08 июня 2011

В настоящее время у меня есть две карты, которые связывают значения перечисления со строками, одно направление для преобразования входных данных файла во внутреннее представление, другое для вывода (отладки) информации об этом внутреннем представлении.Я хотел бы изменить карту на вектор для более быстрого доступа и преобразования.Но тогда эта функция, которая работает должным образом, не будет работать:

template<class T, class Y>
const T & map_value( const std::map<Y,T> &map, const Y &key )
{
    return (*map.find(key)).second;
}

Так что я попытался сделать это так:

template<class Cont, class T, class Y>
const T & map_value( const Cont &map, const Y &key )
{
    return map[key];
}

Но тогда я не получаю подходящую функциювызов.У меня только что было прозрение, пишущее этот вопрос;const map не имеет члена operator[], что делает это трудным делом.Как мне написать map_value, чтобы он работал как можно быстрее для vector и map?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Оставьте первое определение как есть, но измените второе, чтобы оно охватывало все векторы. Используйте обоих в вашей программе, компилятор при необходимости выберет соответствующую версию.

template<class T, class Y>
const T & map_value( const std::map<Y,T> &map, const Y &key )
{
    return (*map.find(key)).second;
}

template<class T>
const T & map_value( const std::vector<T> &map, size_t key )
{
    return map[key];
} 
2 голосов
/ 08 июня 2011

Это однострочный . Конечно, его перегрузка для обоих типов (карт и векторов) не слишком сложна.

На самом деле, это единственный способ сделать это. Я понимаю желание иметь как можно более общую функцию - хорошо! - но вам нужно для инкапсуляции соответствующего режима доступа (find против operator []). И в вашем случае функция ничего не делает , кроме доступа к структуре данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...