如何扩展STL类以拥有自己的方法?

3

我知道继承STL类是个不好的想法。但是是否有其他方法来扩展它们呢?

比如说,为了提高可读性,我想要在我的向量上调用一个“add”方法,而不是那些难以阅读的“push_back”。

或者,我想要在我的std::map中添加一个简单的“hasKey”方法。

除了创建一个包含std::vector成员的整个包装类,并将每个函数调用从我的包装器传递到向量中,还有其他的方法吗?


4
"而不是使用较难阅读的“push_back”方法。" - Pubby
1
在我看来,myVector.add(myThing) 比 myVector.push_back(myThing) 更容易快速阅读。 - PortMan
3
每位 C++ 程序员都应该知道 std::vector::push_back,而他们需要学习什么是 add。但让我们假装这只是一个(糟糕的)例子。 - Benjamin Bannier
3
重要的不是了解它的功能,而是可读性。另一个例子是使用 myMap.hasKey(key) 而不是 myMap.find( key ) != myMap.end(),前者显然更容易理解。 - PortMan
3
这个例子很糟糕。每个 C++ 程序员都知道标准库,你也应该知道。你是不是也会写 #define begin {#define end } - Benjamin Bannier
显示剩余4条评论
2个回答

14

你应该使用免费函数:

template<typename... Args>
bool has_key(std::map<Args...> const& map, typename std::map<Args...>::key_type key) {
  return map.find(key) != map.end();
}

如果不必要,就不要使用继承。这很愚蠢。


3
它也与Scott Meyer在非成员函数和封装方面的观察链接非常契合。 - Angew is no longer proud of SO

3

一旦开发人员习惯了STL中的名称,更改它们将使代码难以维护。这通常是一个不好的想法。实际上,由于STL类不提供虚析构函数,因此无法从中继承并具有良好的销毁行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接