首页 > 解决方案 > 根据模板参数的类型返回一个值

问题描述

我有一个有效的双向映射(一对一映射)类,如下所示:

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函数,如果用户传递类型为T1say的值t1,它将返回*map1_[t1],同样,如果他们传递类型为T2say的值t2,它将返回*map2_[t2]。保证类型T1与类型不同,T2那么如何通过检查它的类型使其返回一个值?

标签: c++templates

解决方案


如果您可以使用 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
}

推荐阅读