to_string vs cast to string,operator<<

时间:2015-12-21 13:59:39

标签: string c++11 casting conventions

我想知道实现转换为字符串的最佳方法是我自己的类。我已经广泛搜索过(并查阅了一些书籍),但令人惊讶的是我在任何地方都没有找到任何建议。在我看来,选项是:

强制转换为字符串的内部类定义: operator std::string() const

外部超载 std::string to_string(const Obj&)

与此相关:在类或外部声明流操作符<<的重载是不是很好?

1 个答案:

答案 0 :(得分:1)

我说这取决于您尝试生成的字符串类型。如果它用于记录和调试,我可能会重载<<(ostream&),前提是我的日志库支持流(或者可以是支持它的模式)。

如果它作为一个字符串是有意义的而不会让任何人感到惊讶(即将来临的string_view是一个例子),那么我就做了运算符。如果它是一个数字类型(如一个大整数),或者由于任何其他原因需要有字符串表示的任何其他类型,我会添加一个ToString()函数,无论是否成员。

不会但是,添加std::to_string()重载,因为我不想用我自己的非隐藏进入std命名空间标准代码。此外,您甚至无法使用ADL上下文,因为std::to_string()只接受原始操作数。

对于<<(ostream&)运算符,由于os << myObj不起作用,因此无法将其声明为成员函数。你可以做的是将它声明为朋友,然后在类声明中定义它。但是,由于friend关键字,这会使其成为非成员函数。通常,最安全的做法是将其声明为朋友并在源文件中提供实现。