使用const和非const值进行映射

时间:2018-08-02 23:13:59

标签: c++ templates const stdmap

我目前正在查看一些使用以下两种地图实例的代码:

numpy.percentile

std::map<std::string, const Foo>; std::map<std::string, Foo>; 的实现无关的地方。结果,所有以这两个实例之一为输入的函数都有两个实现:一个用于const Foo版本,另一个用于非const Foo版本。

我的问题是:是否可以使用模板创建某些东西(例如,从Foo派生的类),这些模板将使我能够将上述两种类型的版本本质上封装为一个?

编辑:我知道我可能可以仅使用SFINAE编写每个相关功能的一个版本,但是我想知道是否有一种方法可以在“上游”实现一些功能。

如果我的问题没有道理,我深表歉意-我不确定如何以一种很好的方式措辞。

1 个答案:

答案 0 :(得分:1)

可以同时接受地图的const版本和非const版本的函数可以通过以下方式实现:

template <typename T_foo>
T_foo do_something_with_map(std::map<std::string, T_foo> & map)
{
    std::cout << map["m"].i_ << std::endl;
    return map["m"];
}

int main()
{
    std::map<std::string, const Foo> m1;
    Foo f1(1);
    m1.emplace("m", f1);

    std::map<std::string, Foo> m2;
    const Foo f2(2);
    m2.emplace("m", f2);

    auto res1 = do_something_with_map(m1);
    auto res2 = do_something_with_map(m2);
}

以Foo为例:

class Foo {
 public:
 Foo() = default;
 Foo(int i)
     : i_(i)
 {}
 int i_;
};