什么是灵活组成字符串的简洁方法?我不想使用宏。
例如,我可能想要将int转换为十六进制格式的字符串,填充为10个字符的宽度,连接到字符串,另一个数字,...
基本上,我想要ostringstream / printf的灵活性,但需要一行代码。
答案 0 :(得分:6)
我之前使用过这样的东西:
#include <sstream>
class make_string
{
public:
make_string() { }
template <typename T>
explicit make_string(T && rhs)
{
oss << rhs;
}
template <typename T>
make_string &operator<<(T && rhs)
{
oss << rhs;
return *this;
}
operator std::string() const
{
return oss.str();
}
std::string str() const
{
return oss.str();
}
private:
std::ostringstream oss;
};
用法是这样的:
string s = make_string() << "Hello, world" << '!' << 42 << 1.0;
或者像这样:
string s = make_string(4.0);
如果您愿意,它可以灵活地在一个表达式中流式传输多个对象,或者如果您需要,可以立即转换单个类型。它将隐式转换为std::string
,因此您可以将其直接分配给一个T
。它所需要的只是您的类型std::ostream
具有boost::lexical_cast()
对象的流插入运算符。
或者(如上面的评论者所建议的),如果您已在项目中使用Boost,那么{{1}}是另一个潜在的选择。你应该看看它的界面并选择你最喜欢的界面。
答案 1 :(得分:1)
您可以使用此实用程序功能:
// util.h
#include <string>
#include <sstream>
inline std::string to_str(basic_ostream<char>& str) {
return dynamic_cast<std::ostringstream&>(str).str();
}
像这样使用它:
// Example.cpp
#include <stdexcept>
#include "util.h"
using namespace std;
void f(int address) {
runtime_error(to_str(ostringstream() << "Did not find instruction at: " << hex << address)));
}
答案 2 :(得分:1)
另一种方法:
template <typename T>
std::string to_str(T&& t)
{
std::ostringstream out;
out << t;
return out.str();
}