2014-07-22 34 views
0

我需要編寫一個函數concat像:C++:函數concats其所有參數作爲字符串

std::string concat(...); 

接受任何數量的參數變化類型(字符,字符*,INT,STD的 : :string,...) 並返回它們的連接。例如:

concat(88,'a',"home",9) == std::string("88ahome9") 
+2

你嘗試了什麼? – SirDarius

+2

這是兩個問題的組合。 1)如何在函數調用中允許不同數量的參數。 [見這裏](http://stackoverflow.com/questions/1657883/variable-number-of-arguments-in-c)。 2)如何連接各種字符串類型。這個問題是非常基本的,如果你搜索,有幾十個例子在線。 – CoryKramer

+1

您可能想了解[template prameter packs](http://en.cppreference.com/w/cpp/language/parameter_pack)和['std :: ostringstream'](http://en.cppreference.com/W/CPP/IO/basic_ostringstream)。 –

回答

4

您可以使用以下:

template<typename ... Ts> 
std::string concat(Ts&&...args) 
{ 
    std::stringstream ss; 
    const int dummy[] = {0, (ss << std::forward<Ts>(args), 0)...}; 
    static_cast<void>(dummy); // avoid warning for unused variable 
    return ss.str(); 
} 

Live example

或C++ 17,與摺疊表達

template<typename ... Ts> 
std::string concat(Ts&&...args) 
{ 
    std::stringstream ss; 
    (ss << std::forward<Ts>(args) << ...); 
    return ss.str(); 
} 
+0

有趣的做法擴大。如果任意表達式可以擴展爲一系列逗號運算符,那麼會很好:'(ss << std :: forward (args))...;'。這可能是一個很好的理由,爲什麼這是不可能的。 –

+0

很好,但我正在尋找一個解決方案在c + + 03 –

+3

所以這個要求應該在問題中說明。 – Jarod42

0

你可以使用ostringstream在sstream庫中轉換函數。

你會從一行開始,如

ostringstream convert;

與< <操作者

然後轉換您希望(或>>從字符串轉換)的變量,如:

INT VAR = 98;

convert < < var;

然後儲存這個字符串中的:

字符串結果;

result = convert.str();

該字符串現在將包含您的int的內容!

Ofc您可以使用if語句將輸入區分爲字符,整數等。並結合所有字符串以結尾。

btw對不起,拼寫和格式,在手機上xD

相關問題