执行以下操作的“正确方法”是什么? (注意,我不想将消息输出到屏幕(尚未),数据需要存储在变量中。)
std::cout << "Enter a letter: ";
char input;
std::cin >> input;
std::string message = "Today's program was brought to you by the letter '" + input + "'.";
代码向我提供错误消息类型const char*
和const char [3]
到二进制operator+
的无效操作数。
我理解为什么会出现此消息。当谷歌搜索解决方案时,出现的结果建议依次将每个项目转换为字符串。但是,如果你必须连接十几个项目,这就变得不切实际了:
std::string("x:") + x + std::string(", y:") + y + std::string(", width:") + width + std::string(", height:") + height + ...;
c ++中将字符串,字符,字符数组和任何其他可转换数据连接成单个字符串的“正确方法”是什么? c ++中有Python's beautiful string formatting features之类的东西吗?
答案 0 :(得分:4)
您尝试做的事情不会起作用,因为C ++会将您的连接视为尝试添加多个char
指针。如果您将系列中的第一个元素显式地转换为std::string
,它应该可以正常工作。
更改原始代码
string message = "Today's program was brought to you by the letter '" + input + "'.";
到此:
string message = std::string("Today's program was brought to you by the letter '")
+ input + "'.";
q.v。 this SO post更详细地讨论了这个问题(虽然我不知道为什么它被关闭而不是一个真正的问题)。
答案 1 :(得分:2)
有几种方法可以做到这一点,但在实现简单性和便利性之间取得良好平衡的一种方法是使用&#34;格式化程序&#34;这样包裹std::stringstream
的类:
string message = formatter() << "Today's program was brought to you by the letter '" << input << "'.";
格式化程序可以在头文件中非常简单地定义,如下所示:
#include <sstream>
class formatter {
public:
template <typename T>
formatter & operator<<(const T & o) {
stream_ << o;
return *this;
}
const std::string str() const { return stream_.str(); }
operator std::string() {
return stream_.str();
}
private:
std::ostringstream stream_;
};
那里发生了什么:如果您尝试使用临时std::stringstream()
而不是formatter()
,那么它无法正常工作,因为
std::stringstream
无法隐式转换为std::string
std::string message = (std::stringstream() << "foo" << input << "bar").str();
因为,std::stringstream
从其流操作(而不是std::ostream &
)返回std::stringstream &
,并且您无法将ostream
转换为string
一般格式化程序类只允许您在一行中构建和使用stringstream
,并使用最少的样板。