将字符串传递给函数的istringsream参数

时间:2015-11-29 01:03:27

标签: c++ function c++11 stringstream istringstream

我想在函数中使用istringstream,我希望istringstream通过值传递的string进行初始化。我可以避免函数体中的显式istringstream iss_input(string_input);吗?

void f(istringstream command){
}

int main(){
    f( string("create_customer 1 Ben Finegold") );
}

以上说明了我想要实现的目标,但它不起作用。我要解决的问题是command parsing

2 个答案:

答案 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;
}

编辑1

我使用可变参数模板,以防您想要使用其他流初始化本地流。如果string只需要用字符串初始化它,你可以这样做:

void f(string&& str)
{
    istringstream command(forward<Args>(str));
    // You logics...
}

基本相同。