Как создать шаблонную функцию, которая принимает ключ в качестве входных данных и находит значение в C ++ std: map? - PullRequest
0 голосов
/ 25 января 2019

У меня два std: map, где ключ одного типа CustomClass1 , а ключ другого типа CustomClass2 , но тип их значения тот же, std :: string.

//first map
std::map<CustomClass1, std::string>
//second map
std::map<CustomClass2, std::string>

Я хочу создать шаблонную функцию, которая принимает ключ в качестве ввода, который может быть либо CustomClass1 или CustomClass2, и пытается найти связанную строку на карте.

Я знаю, какнайти значение по ключу на карте:

map<key, std::string>::iterator iterator = map.find(key);
if(iterator1 != map.end()){
    //value found
}

Как я могу создать такой метод с помощью функции шаблона?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

С C++17 вы можете использовать if constexpr, чтобы различать типы во время времени компиляции .

#include <map>
#include <string>
#include <type_traits>

struct CustomClass1 {};
struct CustomClass2 {};
//first map
std::map<CustomClass1, std::string> map1;
//second map
std::map<CustomClass2, std::string> map2;

template<typename KeyType>
void foo(const KeyType& key)
{
    if constexpr(std::is_same_v<KeyType, CustomClass1>)
    {
        // do stuff with map1
        map1[key];
    }
    else if constexpr(std::is_same_v<KeyType, CustomClass2>)
    {
        // do stuff with map2
        map2[key];
    }
}
0 голосов
/ 25 января 2019
template <class Map>
std::string getStringFromMap(const Map& map, const typename Map::key_type& key) {
    auto it = map.find(key);
    if (it != map.end()) {
        return it->second; // string found
    } else {
        return std::string(); // return default value
    }
}

Должно работать для любой std :: map.Здесь typename Map :: key_type - псевдоним типа ключа, предоставляемый шаблоном std :: map, поэтому фактический тип ключа 2-го параметра извлекается из экземпляра шаблона карты.Ключевое слово typename сообщает компилятору, что тип элемента ключа key_type должен быть типом.

...