使用模板减少const和非const非成员函数的代码重复

时间:2017-02-02 05:18:38

标签: c++ templates

我有以下两个功能:

Thing* find_thing_by_name(const String & name, Map<String,Thing*> & thing_map)
{
    auto it = thing_map.find(name);
    return it->second;
}
const Thing* find_thing_by_name(const String & name, const Map<String,Thing*> & thing_map)
{
    auto it = thing_map.find(name);
    return it->second;
}

这只是我想要解决的问题的一个简单示例。

函数具有完全相同的主体,但我需要处理我的地图的const和非const版本。我已经看到使用const转换使用成员函数处理此问题,但这些是非成员函数,我想使用模板解决此问题。如何编写一个减少代码重复的模板化函数?我甚至不确定从哪里开始。

2 个答案:

答案 0 :(得分:4)

你可以:

template <typename MAP>
auto find_thing_by_name(const String & name, MAP & thing_map)
{
    auto it = thing_map.find(name);
    return it->second;
}

然后

String s = ...;
Map<String,Thing*> nonconst_m = ...;
const Map<String,Thing*> const_m = ...;
find_thing_by_name(s, nonconst_m); // MAP is deduced as Map<String,Thing*>
                                   // thing_map's type is Map<String,Thing*>&
find_thing_by_name(s, const_m);    // MAP is deduced as const Map<String,Thing*>
                                   // thing_map's type is const Map<String,Thing*>&

答案 1 :(得分:0)

我认为你推翻了这个问题。两个参数变量的方法中的相同代码(通过const引用和非const引用传递)意味着您的代码不会在方法中修改此参数(仅调用其上的const方法)。否则相同的代码不会编译为const引用。这意味着您应该只实现此方法的一个版本,因为您始终可以使用const Map&amp; thing_map形式参数在方法中传递非const thing_map实际参数。 在你的实际例子中也没有必要在第二个例子中返回const Thing *,因为它 - &gt;第二个仍然是Thing *而不是const Thing *。 所以这是我的sujestion:

Thing* find_thing_by_name(const String & name, const Map<String,Thing*> & thing_map)
{
    auto it = thing_map.find(name);
    return it->second;
}

或者如果您想限制对Thing对象的访问,请仅实现此版本:

const Thing* find_thing_by_name(const String & name, const Map<String,Thing*> & thing_map)
{
    auto it = thing_map.find(name);
    return it->second;
}

那么你可以用这种方式使用任何一种变体:

...
const Map<String, Thing *> constMapObj;
const Map<String, Thing *> nonConstMapObj;
....
auto res1 = find_thing_by_name(someKey, constMapObj);
auto res2 = find_thing_by_name(someOtherKey, nonConstMapObj);
相关问题