我想知道是否有可能覆盖operator const char*()
以获得类似Java toString()
的行为,因为%s分隔符代表const char*
,不是吗?我的意思是:
vec3 a(1, 2, 3); // operator const char*() returns a string "<x, y, z>"
printf("%s\n", (const char*)a);
预期产出:
<1, 2, 3>
现在,是的,我知道将operator<<(ostream&)
简单地实现为
ostream& operator<<(ostream& rhs)
{
rhs << "<" << x << ", " << y << ", " << z << ">";
return rhs;
}
但幽默我,在这里。我已经编写了一段代码块,它不能很好地与iostream配合使用,但是使用旧的stdio函数可以更好地工作。我已经知道了iostream函数的好处,比如类型安全性,效率,更快的代码等。事实上,这似乎是代码嗅觉的问题,所以我最终可能会重写它。事实上,我已经尝试过几次重写它来实现流,但事实证明这是一个巨大的痛苦。所以,现在我只想知道如何为对象实现const char * cast的重载。
谢谢!
答案 0 :(得分:4)
const char*
强制转换操作符可能是内存管理的噩梦。谁会引用您的const char*
指针来释放它?
如果您不想使用ostream
运营商超载路线,是否有任何理由无法实施std::string toString() const
方法或std::string toString(const vec3&)
免费功能?每次要打印时,您都必须添加(const char*)
部分,而不是.toString().c_str()
。
答案 1 :(得分:4)
我想知道是否可能,
是的,这是可能的。
是否一个好主意,
不,这不是一个好主意。这不是一个好主意,因为它引入了您必须处理的内存管理问题。
如果答案是肯定的,
$raml2html -i src/sample.raml -o build/sample.html
分配内存?如果答案是否定的,
更好的选择是提供函数char const*
。
如果您可以选择将其添加为成员函数,请使用:
toString()
如果您需要将其作为非会员功能使用,请使用:
std::string toString() const;
你可以用它作为:
std::string toString(vec const& a);
或
printf("%s\n", a.toString().c_str());
取决于您是否具有成员函数或非成员函数。