【发布时间】:2013-09-02 14:38:26
【问题描述】:
我的目标是设计一个装饰 std::string 的 String 类,以提供我的程序需要的一些功能。我想添加的一项功能是能够将任何内容隐式转换为我的 String 以节省一些输入。
为了实现隐式转换,我设计了如下类:
std::ostream& operator<<(std::ostream& o, const String& s);
class String {
public:
template<typename t_value>
String::String(t_value value) {
std::ostringstream oss;
oss << value;
_str = oss.str();
}
private:
std::string _str;
}
这适用于任何定义了<<operator 的类型。任何没有流操作符的类都会出现问题。编译器错误会很好,但我得到的是无限递归,因为 C++ 尝试使用我的全局 << 运算符来尝试转换为我的 String 类型。
我的主要目标是编写这样的代码
class Foo {
int _memberWithUnderscoreInName;
}
String s = Foo();
并在构造函数中获得编译器错误而不是无限循环。
有没有简单的解决方案?
【问题讨论】:
-
这与您的问题无关,我可能错了,但以下划线开头的名称不被认为是不好的做法吗?
-
我认为这是为了避免在 C++11 的
to_string()中输入to_? -
只使用
std::stringstream有什么问题? -
underscore topic 上好像有一些讨论,但是单前导下划线至少不保留,只要后面不跟大写字母。
-
@AdriC.S.:这样的名称很好,只要它们不在全局命名空间中,并且只有一个下划线,后面没有大写字母。如果您有兴趣,请在here 讨论血腥细节。
标签: c++ string type-conversion implicit-conversion