Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据模板参数的类型返回值_C++_Templates - Fatal编程技术网

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
}