我目前正在查看一些使用以下两种 map 类型实例的代码:
std::map<std::string, const Foo>;
std::map<std::string, Foo>;
Foo
的实现不相关。因此,所有将这两者之一的实例作为输入的函数都有它们的两个实现:一个用于 const Foo
版本,另一个用于非 const Foo
版本。
我的问题是:是否有可能使用模板创建一些东西(例如从 std::map
派生的类),这将允许我基本上封装上述类型的两个版本作为一个?
编辑:我知道我可能可以使用 SFINAE 只需要为每个相关函数编写一个版本,但我想知道是否有一种方法可以在“上游”进一步实现一些东西。
如果我的问题没有意义,我深表歉意 - 我不确定如何用合适的方式表达它。
最佳答案
可以通过这种方式实现可以接受 map 的 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_;
};
关于c++ - 具有常量和非常量值的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51663316/