C++ C+中的标识字符串流+;
是否可能有一个具有这种行为的字符串流C++ C+中的标识字符串流+;,c++,tokenize,stringstream,C++,Tokenize,Stringstream,是否可能有一个具有这种行为的字符串流 std::istringstream stringstream("hello world"); std::string output; stringstream >> output; assert(output == "hello world"); 用例: template <typename T> T as(void) { T t; std::istringstream stringstream(this->
std::istringstream stringstream("hello world");
std::string output;
stringstream >> output;
assert(output == "hello world");
用例:
template <typename T>
T as(void) {
T t;
std::istringstream stringstream(this->m_str);
stringstream >> t;
return t;
}
模板
T as(无效){
T;
std::istringstream stringstream(this->m_str);
stringstream>>t;
返回t;
}
如果T是std::string,它将不起作用。我可以进行专门化,但我想避免它。不直接,因为使用
std::string
的重载只读取第一个空格,不包括第一个空格,所以调用只会得到“hello”
我不这么认为,因为它“标记”了输入。您是否尝试将输入字符串设置为“\“hello world\”
。我相信它会变成“hello word”
,而不是hello world
。您需要从其中一个流类派生并重新实现字符串的提取操作符来实现这一点。但是您可以执行output=stringstream.str()改为code>。只是想了解一下:您不想使用stringstream.str()
,有什么特别的原因吗?@jrok:如果我有一个函数,它接受std::istream
,我从中读取一个单词(,in>>str;
),并将多个单词写入str
,我会感到惊讶。当您的代码被覆盖时operator@NisonMaël:在这种情况下,您应该添加一个专门化。这是获得预期语义的简单方法,也会更有效(为什么要经过两次转换才能得到相同的结果?),但是没有办法关闭这种行为吗?@NisonMaël:你应该真正解释一下你想要实现什么,而不是如何修复可能不合适的方法。如果您创建自己的具有该行为的mystream
,并将其传递给其他代码以使用operator>
读取,则那里的代码将期望调用返回一个单词,但重载的operator将返回多个单词,这可能会在其他地方破坏其他代码。@NisonMaël:有什么原因不想专门化吗?不是特别的。我喜欢尽可能的普通化,我不喜欢专门化,即使有时这是一种方式。我会使用它,但是我对@Torsten answer很好奇,是否可以使用ctype facet来抑制拆分?@NisonMaël:所以你愿意添加更多代码,只要它不是专门化,而简单的解决方案是专门化的?我要做的是创建一个私有实现模板和一个自由函数,然后分派(所有成员):template void as(T&T){/*impl as in question*/}void as(std::string&s){s=m_str;}template T as(){tr as(r);return r;}
(请注意,我不太喜欢函数的专门化,但在大多数情况下,您可以添加重载来避免它。