我想在函数中使用istringstream
,我希望istringstream
通过值传递的string
进行初始化。我可以避免函数体中的显式istringstream iss_input(string_input);
吗?
void f(istringstream command){
}
int main(){
f( string("create_customer 1 Ben Finegold") );
}
以上说明了我想要实现的目标,但它不起作用。我要解决的问题是command parsing。
答案 0 :(得分:1)
我只使用std::string
作为参数。但是,如果您想传递std::istringstream
,则需要将其明确传递给f
,作为std::istringstream
is marked explicit (#2)的std::string
构造函数。例如:
f(std::istringstream{"create_customer 1 Ben Finegold"});
上面的代码构造了一个临时的std::istringstream
作为参数,然后将其移动到函数的参数command
中;它使用来自here的移动构造函数#3。
请注意,我们不需要笨重的
f(std::istringstream{std::string{"create_customer 1 Ben Finegold"}});
因为const char*
is not explicit (#5)的std::string
构造函数,并且允许编译器执行最多一个隐式的用户定义转换。因此,在我发布的第一个代码行中,字符串文字"create_customer 1 Ben Finegold"
被转换为std::string
,然后用于显式构造临时std::istringstream
参数,然后将其移入{{1} }}
答案 1 :(得分:0)
我不太确定你要用void f(...)
做什么,但我认为这应该做你想要的:
template<typename... Args>
void f(Args&&... args)
{
istringstream command(forward<Args>(args)...);
// You logics...
}
int main()
{
f("create_customer 1 Ben Finegold"s);
//...
return 0;
}
我使用可变参数模板,以防您想要使用其他流初始化本地流。如果string只需要用字符串初始化它,你可以这样做:
void f(string&& str)
{
istringstream command(forward<Args>(str));
// You logics...
}
基本相同。