C++ 将字符串传递给函数的istringsream参数
我想在函数中使用C++ 将字符串传递给函数的istringsream参数,c++,function,c++11,stringstream,istringstream,C++,Function,C++11,Stringstream,Istringstream,我想在函数中使用istringstream,我希望istringstream由值传递的字符串初始化。我是否可以避免显式的istringstream iss_输入(字符串_输入)在函数体中 void f(istringstream command){ } int main(){ f( string("create_customer 1 Ben Finegold") ); } 以上说明了我想要实现的目标,但它不起作用。我要解决的问题是。我不太确定你想用void f(…)做什么,但我认为这
istringstream
,我希望istringstream
由值传递的字符串初始化。我是否可以避免显式的istringstream iss_输入(字符串_输入)代码>在函数体中
void f(istringstream command){
}
int main(){
f( string("create_customer 1 Ben Finegold") );
}
以上说明了我想要实现的目标,但它不起作用。我要解决的问题是。我不太确定你想用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;
}
模板
无效f(参数&&…参数)
{
istringstream命令(转发(args)…);
//你的逻辑。。。
}
int main()
{
f(“创建客户1 Ben Finegold”);
//...
返回0;
}
编辑1
我使用可变模板只是为了防止您想用其他流初始化您的本地流。如果只需要使用字符串初始化字符串,则可以执行以下操作:
void f(string&& str)
{
istringstream command(forward<Args>(str));
// You logics...
}
void f(字符串和str)
{
istringstream命令(前进(str));
//你的逻辑。。。
}
本质上是一样的。我只使用std::string
作为参数。但是,如果要传递std::istringstream
,则需要将其显式传递给f
,作为接受std::string
的std::istringstream
构造函数。例如:
f(std::istringstream{"create_customer 1 Ben Finegold"});
上面的代码构造了一个临时的std::istringstream
作为参数,然后将其移动到函数的参数命令中;它使用移动构造函数#3 from
请注意,我们不需要笨重的
f(std::istringstream{std::string{"create_customer 1 Ben Finegold"}});
因为std::string
的const char*
构造函数和编译器最多允许执行一次隐式用户定义转换。因此,在我发布的第一行代码中,字符串literal“create_customer 1 Ben Finegold”
被转换为std::string
,然后用于显式构造临时std::istringstream
参数,然后将其移动到命令中
,因此需要函数的参数f(...)
直接用于在函数f
中构造本地istringstream
对象。这就是你要问的吗?我不明白你从中得到了什么以及为什么要这样做。如果这是关于递归调用,为什么不重载f
?istringstream
的构造函数来自string
t、 因此,不可以进行隐式转换。此外,istringstream
不可复制,您不能按值接受它。只需获取字符串。@s.bandara,因为f()
将位于map命令;
中,并将像commands[command](参数)
一样被调用。如果我只是重载了f()
,我需要像这样的长ifelseif(command==“create_bank”){create_bank(arguments);}
和if(command==“create_customer”){create_customer(arguments);}
等。从string
到istringstream
不可能进行隐式转换。您当然可以显式转换。就我个人而言,我看不出练习的意义。为什么要使用可变模板而不是简单的std::string
作为参数?@vsoftco以防Slazer需要使用其他stu初始化流ff.@Lucien我不明白变量模板Either的必要性。你能详细说明一下吗?我想你忘了提到我需要在f()
中将istringstream命令更改为istringstream&&command
。然而,我的想法是将字符串
传递给f()
,让f()
透明地创建istringstream
并使其在正文中可用,而无需任何代码在正文中创建它。这可能吗?@Slazer我认为您不希望有一个istringstream&&
参数,除非您真的不想离开目的地并只是“检查”右值引用。在我发布的解决方案中,命令
是一个参数,您可以将调用函数时创建的istringstream
移动到该参数中。正文中没有istringstream
创建代码。我不认为您可以做得比这更简单,因为没有从字符串toistringstream
。