我想知道实现转换为字符串的最佳方法是我自己的类。我已经广泛搜索过(并查阅了一些书籍),但令人惊讶的是我在任何地方都没有找到任何建议。在我看来,选项是:
强制转换为字符串的内部类定义:
operator std::string() const
外部超载
std::string to_string(const Obj&)
与此相关:在类或外部声明流操作符<<
的重载是不是很好?
答案 0 :(得分:1)
我说这取决于您尝试生成的字符串类型。如果它用于记录和调试,我可能会重载<<(ostream&)
,前提是我的日志库支持流(或者可以是支持它的模式)。
如果它作为一个字符串是有意义的而不会让任何人感到惊讶(即将来临的string_view
是一个例子),那么我就做了运算符。如果它是一个数字类型(如一个大整数),或者由于任何其他原因需要有字符串表示的任何其他类型,我会添加一个ToString()
函数,无论是否成员。
我不会但是,添加std::to_string()
重载,因为我不想用我自己的非隐藏进入std
命名空间标准代码。此外,您甚至无法使用ADL上下文,因为std::to_string()
只接受原始操作数。
对于<<(ostream&)
运算符,由于os << myObj
不起作用,因此无法将其声明为成员函数。你可以做的是将它声明为朋友,然后在类声明中定义它。但是,由于friend
关键字,这会使其成为非成员函数。通常,最安全的做法是将其声明为朋友并在源文件中提供实现。