C++ 根据模板参数的类型返回值
我有一个工作的双向映射(一对一映射)类,如下所示:C++ 根据模板参数的类型返回值,c++,templates,C++,Templates,我有一个工作的双向映射(一对一映射)类,如下所示: 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_; }; 模板 类BiMap { 公众: 无效插入(常数T1&
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_;
};
模板
类BiMap
{
公众:
无效插入(常数T1&a、常数T2&b);
私人:
地图地图1;
地图地图2;
};
我已经能够实现
insert
功能。现在,我想实现一个检索
函数,这样,如果用户传递类型为T1
的值,比如说T1
,它将返回*map1[T1]
,同样,如果用户传递类型为T2
的值,它将返回*map2[T2]
。可以保证类型T1
不会与类型T2
相同,因此如何通过检查其类型使其返回值?如果可以使用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
}
您的意图是只想编写一个
检索
函数,而不必实现两个几乎做同一件事的不同函数吗?@Xirema是的,我忘了提到这一点。旁注:如果在C++11或更高版本上,您可能想要静态断言(!std::Is_same)
因为如果T1
和T2
是同一类型,任何使用重载/模板的retrieve()
实现都会导致编译错误,或者只从两个映射中的一个映射中检索。它可以工作!非常感谢。我正在使用C++14。使用前者比后者有什么好处吗?@lucieon我个人喜欢两个重载的解决方案,因为它更短,更容易理解。它还允许您的代码在更多实现上编译。通常情况下,我只会在有超过少数重载的情况下使用第一种方法。这里只有两种可能的类型,因此使用重载更合适。
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
}