如何连接"constant strings"和字符?

How do I concatenate "constant strings" and chars?

本文关键字:constant strings 字符 何连接 连接      更新时间:2023-10-16

做以下事情的"正确方法"是什么?(注意,我还不想将消息输出到屏幕上,数据需要存储在一个变量中。)

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那样漂亮的字符串格式化功能吗?

你想做的事情不会起作用,因为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 + "'.";

无论如何。这篇文章更详细地讨论了这个问题(尽管我不知道为什么它被关闭了,因为不是一个真正的问题)。

有几种方法可以做到这一点,但是在实现的简单性和便利性之间取得良好平衡的一种方法是使用"formatter"类,它像这样包装std::stringstream:

string message = formatter() << "Today's program was brought to you by the letter '" << input << "'.";

其中formatter可以在头文件中非常简单地定义如下:

#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

formatter类只允许您在一行中构造和使用stringstream,并且只需要最少的模板。

相关文章: