2015-11-29 230 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

相關問題