2014-10-08 60 views
0

我怎樣才能做到這一點比較容易的方式:C++參數支持字符串和整數的結構?

是不是有「無功」,在C++像.NET?我需要參數才能成爲整數和字符串。

+3

C#的'var'就像'auto'。這並不意味着變體。使用'boost :: variant'。 – chris 2014-10-08 23:00:38

+1

C++本身不支持「此類型可以是多種類型」。有一些模板庫晚餐,比如'boost :: variant'。可能無論它應該是一個模板,例如 – 2014-10-08 23:01:03

+0

。函數模板 – 2014-10-08 23:08:05

回答

0

你在C++中有'auto'這個關鍵字,但是它在C++ 0x和C++ 1x上,它是編譯器,它決定了類型,編譯後它不能改變。

你可能尋找類似的boost ::變種:http://www.boost.org/doc/libs/1_56_0/doc/html/variant.html

+0

但它不適用於聲明結構! ;) – 2014-10-08 23:05:39

+0

它與對象一起工作,對迭代器非常有用:http://www.informit.com/articles/article.aspx?p=1848529 – Marchah 2014-10-08 23:10:12

+0

這與上述評論完全無關。 – chris 2014-10-08 23:15:41

0

您可以使用Union,但你仍然需要知道你指定什麼類型的編譯時間。您可以通過使用帶有隱式鍵入的模板來分配值來隱藏這一點,但在讀取值時仍需知道適當的類型。不知道這將是多麼有用。

你也可以使用多態性和你自己的(模板)包裝類代替內置類型。

0

我建議你把通用代碼分解出來並設置爲使用工廠。

使用工廠
的問題是,你不知道參數的類型,直到您解析字符串。最好的方法是將所有東西都保存爲一個字符串或創建一個Factory並使用一個基類。有關更多研究,請參閱「C++工廠設計模式示例」。

struct Base_Parameter 
{ 
    std::string& parameter_as_string; 
    virtual void extract_parameter(const std::string& parameter_string) = 0; 
}; 

struct Int_Parameter : public Base_Parameter 
{ 
    int parameter_value; 
    void extract_parameter(const std::string& parameter_string) 
    { 
    std::istringstream param_stream(parameter_string); 
    param_stream >> parameter_value; 
    } 
} 

你的參數「表」是,要麼指向基類(如果類型未知),或者你可以有後代結構的容器的容器:

struct Parameter_Container 
{ 
    std::vector<Int_Parameter> parameters; 
}; 

至於工廠,工廠將是一個可以根據某些標準創建參數對象的對象。它會返回一個指向基類的指針。

注意:除非您處於嚴格受限的平臺(如嵌入式系統),否則不要擔心重疊的內存位置以節省空間。