Возврат значения в зависимости от типа параметра шаблона - PullRequest
2 голосов
/ 24 октября 2019

У меня есть класс работающей двунаправленной карты (сопоставление один к одному) следующим образом:

template <typename T1, typename T2>
class BiMap
{
public:
    void insert(const T1& a, const T2& b);
private:
    std::map<T1, T2*> map1_;
    std::map<T2, T1*> map2_;
};

Мне удалось реализовать функцию insert. Теперь я хочу реализовать функцию retrieve таким образом, чтобы, если пользователь передал значение типа T1 скажем t1, он вернул бы *map1_[t1], и аналогично, если они передадут значение типа T2 скажем t2, онвернусь *map2_[t2]. Гарантируется, что тип T1 не будет совпадать с типом T2, так как я могу заставить его вернуть значение, проверив его тип?

1 Ответ

9 голосов
/ 24 октября 2019

Если вы можете использовать C ++ 17, ваша функция извлечения будет выглядеть как

template <typename T>
auto retrieve(T const& key)
{
    static_assert(std::is_same_v<T, T1> || std::is_same_v<T, T2>, "Key type is not in map");
    if constexpr (std::is_same_v<T, T1>)
        return *map1_.at(key); // or whatever you actually want to return
    else
        return *map2_.at(key); // or whatever you actually want to return
}

Если вы не можете использовать C ++ 17, тогда я просто напишу 2 перегрузки, такие как

auto retrieve(T1 const& key)
{
    return *map1_.at(key); // or whatever you actually want to return
}
auto retrieve(T2 const& key)
{
    return *map2_.at(key); // or whatever you actually want to return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...