c++ - 根据模板参数的类型返回一个值
问题描述
我有一个有效的双向映射(一对一映射)类,如下所示:
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
say的值t1
,它将返回*map1_[t1]
,同样,如果他们传递类型为T2
say的值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
}
如果您不能使用 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
}
推荐阅读
- python - 如何避免 for 循环并在此代码中使用替代方法(python 和 postgres sql)?下面是我的代码
- java - 具有最小和最大线程数的 ScheduledExecutorService
- logic - 以自然演绎方式证明陈述的软件(Lemmon 引入的表格形式)
- android - 在Android上制作自定义RatingBar,当RatingBar未点击时颜色会改变
- css - 继承自 CSS ID
- web - 是否报告错误
- spring-boot - SpringBoot 执行器保持状态
- reactjs - TypeError: Cannot read properties of undefined (reading 'map') Trying to Read REST api and display
- tkinter - 如何使用 grid_columnconfigure Tkinter 为每一行配置不同的列?
- html - 基于对象值渲染时创建引导卡网格的问题