2016-12-16 92 views
1

我創建了一個名爲JSON的類,它有三種數據類型(string,int,bool)。我想創建一個可以獲取這些類型的構造函數。 我不想爲三種數據類型創建三個獨立的構造函數,但可以處理所有這三種數據類型的構造函數。如何創建未知數量的變量和未知類型變量的構造函數

我只創建一個構造函數的原因是因爲我想要一個可以處理未知數量變量和未知變量類型的構造函數。

下面的構造可以獲得類型的輸入:JSON{1, 2, 3, 4, 2, 13, 3, ..., n}爲int類型, 的n而不是類型:JSON{1, 2, 3, "hello", 2, 13, true, ..., n}

JSON(initializer_list<int> init) : v(init) {} 

我怎樣才能做到這一點?

+0

'的std :: variant'可以幫助 – Ap31

+0

的std ::變種是不工作... –

+0

'的boost :: variant'可以幫助 –

回答

1

您可以創建與您的數據類型作爲其成員的自定義類,並通過這個類對象的構造器:

struct MyData { 
    std::string strJsonVal; 
    int intJsonVal; 
    bool blnJsonVal; 
}; 

然後,在你Json類,你可以將它傳遞給構造函數,並獲得

Json(MyData strctMyData) 
{ 
    strJsn = strctMyData.strJsonVal; 
    intJsn = strctMyData.intJsonVal; 
    blnJsn = strctMyData.blnJsonVal; 
} 
+0

爲什麼有些人將此標記爲不是答案 – glant

+1

您應該舉例說明您的意思,以及更多解釋。 –

+0

@GuillaumeRacicot這個陳述的哪一部分是不可理解的,它需要一個代碼來支持它 – glant

2

既然你有一個類型的數量有限,這是可能的送,我想創建一個能以這些值來構建一個結構:

從參數對象值
struct Value { 
    Value(int i); 
    Value(std::string s); 
    Value(bool b); 

private: 
    // hold it using boost::variant, std::variant or an union. 
}; 

Value類是有以表示可與一個int,一個std::stringbool構成的值。

然後,你可以在你initializer_list收到這些實例:

struct Json { 
    Json(std::initializer_list<Value> values); 
}; 

所以有您接收的每一個可以與int,一個std::stringbool構造的Value列表。這裏有一個例子Live at Coliru

+0

這就是JsonCpp如何做到的。 –

+0

Value(int i)的用途是什麼;'? –

+0

@JohnTraveli它是一個構造函數,它將'int'作爲參數。 –