如何连接“常量字符串”和字符?

时间:2015-08-28 04:28:29

标签: c++ string char

执行以下操作的“正确方法”是什么? (注意,我不想将消息输出到屏幕(尚未),数据需要存储在变量中。)

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之类的东西吗?

2 个答案:

答案 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,并使用最少的样板。