如何将asString()/ toString()添加到std :: vector?

b.b*_*old 1 c++ inheritance stl

我的情况如下:有一些类MyList可能会在以后获得特定的实现.现在,像std :: vector这样的行为很好.

但是,我真的需要一种简单的方法来调用某种asString()/ toString()方法,因为我需要它在测试断言,调试输出等等.我看到的唯一选择是:

  1. 公共继承.我永远不会通过基指针删除这样的列表,因为永远不应该有任何基本指针.如果我这样做,反正将没有指针成员.但是,经验法则仍然指出:不要从stl容器继承.

  2. 某种"全局"(实际上在命名空间中)当然是以MyList的实例作为参数并为我做asString()魔术的方法.在这种情况下,MyList可能是std :: vector的简单typedef.

我不太喜欢那些选项.还有什么我没想到的吗?或者如果不是 - 我应该选择哪种方式?

mok*_*oka 8

第二种方法有什么问题?这是迄今为止最容易也很优雅的.-想象一下包装矢量的替代方案.这将导致你很多额外的工作和胶水代码容易出错!我肯定会采用功能方法!

编辑:顺便说一句,我几乎只使用免费功能(有时是静态成员)进行转换.想象一下,你有一些类型的东西,不知何故需要转换为字符串.让toString()函数作为自由函数而不是成员不会让你头疼,因为你基本上可以简单地重载函数,而不必触及任何现有的类(或者可能)您甚至没有源访问权限的类).

然后你可以有一个像这样的功能:

template<class T>
void printDebugInfo(const T & _obj)
{
   std::cout<<toString(_obj)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

而你不会遇到你遇到的限制.


Seb*_*ach 6

实际上,类类型的自由函数是一种标准技术,被认为是类型接口的一部分.阅读Herb Sutter 撰写这篇文章,其中一位有C++标准化声音的人.

通常,首选自由函数而不是成员函数.这增加了封装和可重用性,并减少了类膨胀和耦合.请参阅Scott Meyers的这篇文章以获取更深入的信息(如果您希望提高C++的有效性和清晰使用率,那么您应该阅读的C++书籍备受推崇).

另请注意,您永远不应从STL容器派生.它们不是作为基类设计的,您可以轻松调用未定义的行为.但是看看从C++ STL容器中获取是否存在任何真正的风险?.