简洁灵活的组成字符串的方式
Concise way of flexibly composing a string?
灵活组合字符串的简洁方式是什么?我不喜欢使用宏。
例如,我可能想将int转换为十六进制格式的字符串,填充为10个字符的宽度,连接到字符串,另一个数字,…
基本上,我想要ostringstream/printf的灵活性,但是在一行代码上。
我以前用过这样的东西:
#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
,因此您可以直接将其赋值为1。它所需要的只是类型T
对std::ostream
对象有一个流插入操作符。
或者(正如上面的评论者所建议的),如果您已经在项目中使用Boost,那么boost::lexical_cast()
是另一个潜在的选择。你应该看看它的界面,然后选择一个你最喜欢的。
您可以使用这个实用函数:
// 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)));
}
另一种方法:
template <typename T>
std::string to_str(T&& t)
{
std::ostringstream out;
out << t;
return out.str();
}
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 我可以以相同的方式使用 char* c 和字符串吗?
- 如何以这种方式处理字符串数组
- 有没有一种递归的方式来制作这个字符串数组?
- 如何以适当的方式使用子字符串
- Newline更改了C 中打印从文件读取的字符串的方式
- 如何以优雅高效的方式将无符号/有符号整数/长整型转换为 C 字符串?
- 我可以使用什么方法或方式将用户输入的字符串转换为 C++ 中的整数
- 字符串中的空格是否会改变程序解释它的方式
- 如何将 boost::beast 中的序列化数据转换为字符串,以便我可以以 FIFO 方式处理它?
- 在现代C++中初始化字符串的方式是否有不同
- 以一种方式使用字符串选择(如果语句)
- 在 C++11 中编译时以词典方式比较两个字符串
- 是否有函数/WinAPI 可以判断一个字符串是否以不区分大小写的语言方式以另一个字符串开头?
- 以简单且更少的代码方式将字符串添加在一起
- G++ 和 boost 中 regex_replace() 替换字符串中''的不同处理方式
- 这种反转字符串的方式安全吗?
- 将映射从字符串到INT的最佳方法,而另一个同时进行的方式
- 最易读(代码术语)的方式,用 C++03 中的构造数据填充地图<字符串、字符串>