如何避免在转换字符串令牌流时重复istringstream构造
How to avoid repeated istringstream construction when converting stream of string tokens
我(打算)使用这个答案中的代码从CSV中读取一些内容。本质上,我得到了一个迭代器,用于连续,
字符之间的字符串;但我不想把它们放在字符串向量中,而是想把这些字符串解析成(任意)类型T的元素,这来自于模板参数。所以…
template <typename T>
void foo(const std::string& line)
{
// ....
std::vector<T> vec;
using namespace boost;
tokenizer<escaped_list_separator<char> > tk(
line, escaped_list_separator<char>('', ',', '"'));
for (tokenizer<escaped_list_separator<char> >::iterator i(tk.begin());
i!=tk.end();++i)
{
/* magic goes here */
}
我可以使用istringstream`(例如这里建议的):
std::istringstream iss(*i);
T t; iss >> t;
vec.push_back(t);
但这太夸张了(我可能在这里建造了两次甚至三次)。如果C++有一个像std::to_string
一样的std::from_string()
,那么我就只做
vec.emplace_back(std::from_string(*i));
但这并不存在。也许是boost::lexical_cast
?我真的宁愿用一些标准的东西。
我该怎么办?
使分发流static thread_local
T parse (const string& line){
static thread_local istringstream stream;
stream.str(""); //flush the stream
//keep using stream
}
如果你的应用程序是单线程的,你可以放弃thread_local
另一个不涉及将流保持为函数静态的解决方案是用Parser
对象包裹流,并继续使用该对象,用str
刷新其内部缓冲区
class Parser{
std::stringstream stream;
public:
void parse(const std::string& data){
stream.str("");
// the rest
}
}
Parser parser;
parser.parse("my,data");
parser.parse("other,data");
编辑:为了防止每个CCD_ 9类型的不稳定、将流封装在不同的函数中,制作一个助手函数,从每个线程构造一次std::istringstream
:
namespace detail {
istringstream& getStream(){
static thread_local istringstream stream;
stream.str("");
return stream;
}
} // namespace detail
template<class T>
void parse(){
auto& stream = detail::getStream();
//do soemthing with stream
}
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 从持续时间构造std::chrono::system_clock::time_point
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 构造对象的歧义
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 如何修复函数样式强制转换或类型构造的预期"("?
- 使用 string_view 构造 istringstream 无法编译
- 如何避免在转换字符串令牌流时重复istringstream构造
- 带有istringstream的c++构造函数不起作用