是否有将类转换为字符串的标准方法
Is there a standard way to convert a class to a string
在Java中,标准是定义方法toString()
来返回类的字符串表示形式。除了超载operator<<
之外,c++中还有这样的标准吗?我知道有std::to_string()
方法来获得一个数字的字符串表示。c++标准是否谈到定义方法to_string()
以服务于类的类似目的,或者是否存在c++程序员遵循的共同实践?
实现这类操作的标准方法是提供插入操作符,以便将对象插入到流中——流可以是任何类型的流,例如stringstream。
如果你愿意,你也可以提供一个转换为字符串的方法(对你的插入操作符很有用),并且,如果你发现转换是可以接受的,你可以提供一个'to string'操作符。
这是我的标准'point'类示例:
template <typename T>
struct point
{
T x;
T y;
point(): x(), y() { }
point( T x, T y ): x(x), y(y) { }
};
template <typename T>
std::ostream& operator << ( std::ostream& outs, const point <T> & p )
{
return outs << "(" << p.x << "," << p.y << ")";
}
我还倾向于保留一个方便的函数来将内容转换为字符串:
template <typename T>
std::string to_string( const T& value )
{
std::ostringstream ss;
ss << value;
return ss.str();
}
现在我可以很容易地使用它了:
int main()
{
point p (2,-7);
std::cout << "I have a point at " << p << ".n";
my_fn_which_takes_a_string( to_string(p) );
你会发现Boost Lexical Cast库也是为这类事情设计的。
c++标准没有规定这样做的方法,但看起来有一个提议可能会引入这样一个选项通用to_string/to_wstring函数,在动机部分中说,也强调了当前正在采取的常见做法(我将在下面演示):
长期以来,c++程序员一直在寻找一种简单的方法将对象转换为其字符串表示形式。的典型答案这个问题是创建一个本地ostringstream,插入对象返回到流中,然后使用STR获取结果字符串成员函数。这个解决方案简单、安全、灵活而且可扩展的,虽然绝对太啰嗦了应该是一个函数调用。提供c++ 11(部分)以一组重载to_string/to_wstring形式的解决方案功能。不幸的是,这些仅限于内置的数字类型。也存在非标准的解决方案——最明显的Boost::lexical_cast,它提供对象和的双向转换.
本文提出了一个解决方案:
- 泛化了现有的to_string/to_wstring函数,用于任何提供流输出操作符的类型和任何basic_string专业化,
- 与这些功能保持一致并基本兼容,
- 提供额外的格式化和连接功能,
- 通过构建熟悉的ostringstream解决方案,在概念上很简单。
有STL和Herb Sutter的两篇旅行报告,我都没有看到这篇论文。因此,希望这将在kona发布后的邮件中讨论。
他们在提案中提到的第一种方法看起来就像这个答案中的例子:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
与类似于这里的例子的东西结合:
template <typename T>
std::string to_string(const T& value) {
std::ostringstream os;
os << value;
return os.str();
}
我们可以找到一个boost::lexical_cast
的例子,在问题启用类使用boost::lexical_cast。
似乎没有标准的方法。据我所知,c++标准不允许重载std::to_string
函数。
我最终使用了以下两种解决方案之一:
解决方案# 1
代替toString()方法,你可以使用:
operator std::string() const {
return "Object string.";
}
为了支持流,你可以添加这样的内容:
friend std::ostream & operator <<(std::ostream &out, const YourClass &obj) {
return out << static_cast<std::string>(obj);
}
我希望<<
操作符只是内联第一个操作符的转换。
解决方案# 2
或者你可以用其他方式,如果你认为经常在流style:
friend std::ostream & operator <<(std::ostream &out, const YourClass &obj) {
out << "Object ";
out << "string.";
return out;
}
并在转换操作符内使用:
operator std::string() const {
std::ostringstream out;
out << *this;
return out.str();
}
这两种方法都可以满足大多数情况。
号c++标准是否提到为类定义to_string()方法来达到类似的目的?
或者c++程序员是否有一个共同的实践。
。然而,我怀疑每个项目都有类似的功能。名称和返回类型很可能取决于项目的编码准则。
在我的工作中,我们使用virtual QString toString() const = 0;
在一个基类中。
你可以开始在你的项目中使用类似的东西。
virtual std::string toString() const = 0;
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 从标准::字符串到标准::矢量<bool>的快速转换
- 使用标准库计算字符串中的十进制数
- 如何初始化一个标准::字符串数组?
- C++ - 转换标准::浮点数组的字符串
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 在命名管道中发送标准::字符串流
- 标准::字符串与空字符可能吗?
- 如何从标准::string_view正确创建标准::字符串?
- 从常量字符*、字符*参数到标准::字符串的直接转换接口
- 热将标准::__cxx11::字符串转换为标准::字符串
- 如何将字符*浅复制到标准::字符串?
- 十进制到八进制递归C++.以标准::字符串格式输出
- 对于C字符串,是否有一个标准的C++迭代器
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 将来C++的标准库会包含网络、字符串算法,..吗?
- 分段错误标准::矢量<标准::字符串>
- 如何通过标准字符串打印 ostream 变量的值?