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()
,我需要像这样的长ifelse
if(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
创建代码。我不认为您可以做得比这更简单,因为没有从
字符串to
istringstream