2015-11-29 204 views
1

我想在一个函数内使用istringstream,我希望istringstreamstring初始化为值。我能否避免函数体中的显式istringstream iss_input(string_input);将字符串传递给函数的istringsream参数

void f(istringstream command){ 
} 

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

以上演示了我想实现的目标,但它不起作用。我正在解决的问题是command parsing

+1

所以你希望函数'f(...)'的参数直接用于构造函数'f'中的本地'istringstream'对象。你在问什么? – Lucien

+0

我不明白你从中得到什么,为什么你会这样做。如果这是关于递归调用,为什么不重载'f'? –

+0

'istringstream'从'string'的构造函数是显式的,所以不,你不能有一个隐式转换。此外,'istringstream'不可复制,你不能接受它的价值。只要一个字符串。 –

回答

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

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

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

它基本上是一样的。

+1

为什么可变参数模板不是简单的'std :: string'参数? – vsoftco

+0

@vsoftco为了防止Slazer需要用其他东西初始化流。 – Lucien

+0

@Lucien我不明白需要可变模板eitrher。你能详细说明吗? – Slazer

1

我只是使用std::string作为参数。但是如果你想通过std::istringstream,那么你需要明确地将它传递给f,因为std::istringstream构造函数需要std::stringis marked explicit (#2)。例如:

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*构造std::stringis not explicit (#5),编译器是允许最多有一个隐含的用户自定义转换来执行。因此,在我发布的第一个代码行中,字符串文字"create_customer 1 Ben Finegold"被转换为std::string,然后用它来显式构造临时std::istringstream参数,然后将其移入command

+0

我想你忘了提及我需要在'f()'中将'istringstream command'更改为'istringstream && command'。然而,我的想法是将一个'string'传递给'f()',让'f()'透明地创建'istringstream',并使其在body **中可用,而不需要任何代码在body中创建它。这可能吗? – Slazer

+0

@Slazer我不认为你想有一个'istringstream &&'参数,除非你不想从目的地移动,只是“检查”右值引用。在我发布的解决方案中,'command'是一个参数,您可以在其中调用'istringstream',该参数在调用函数时创建。正文中没有'istringstream'创建代码。我不认为你可以做得更简单,因为没有从'string'到'istringstream'的隐式转换。 – vsoftco

相关问题