2015-11-14 87 views
0

我想在我的函數中使用initializer_list作爲參數,以便使用未定數量的特定類型的變量。它必須是一個initializer_list,因爲我希望能夠在函數調用中創建列表,並且因爲我將該列表傳遞給其他子函數。但是,我需要能夠修改列表中的元素,而我不能,因爲initializer_list會自動生成類型爲const的指針。非常量元素initializer_list類

所以我的問題是我如何去做我自己的initializer_list類?使用const刪除頭部的副本不起作用,我似乎無法在任何地方找到答案。

回答

1

你不能。 std::initializer_list是一種神奇的類型,它與編譯器有着複雜的聯繫,並且沒有辦法使用從braced-init-list構建的相同能力創建自己的類型。

從這個意義上說,它有點像std::typeinfostd::nullptr_t。它們恰好在名稱空間std中定義,因此似乎是標準庫的一部分,但它們實際上是預定義的類型,它們是運行時環境的一部分,不能在純C++中模擬。

+1

那麼計劃B是什麼? –

+2

不要修改它們。或者將元素複製到容器中,修改副本並將容器傳遞給其他函數。 –

3

我想你可能只能使用一個向量。

void foo(std::vector<int> values); 

是可調用與

foo({ 1, 2, 3, 4 }); 

,然後就可以通過周圍(移動)矢量照常和元素是modifyable當然。

0

你不能直接這樣做。不過,我之前在代碼中做了一種解決方法。 首先,一個slice類型,它是一個非連續的內存塊的非擁有包裝 - 一個指向它的開始和它的大小的指針。 其次,我添加以下構造函數:

slice(std::initializer_list<T> && list) 
    : slice((T*)list.begin(), list.size()) 
{ } 

其中T是片的類型。這適用於G ++ 4.8和4.9,但我沒有在5.X版本上檢查它。

這絕對是一個黑客,但你可以使用slice<T>如函數參數,然後(有足夠的各種隱含的構造函數)傳遞任何連續的容器那裏,包括arrayvectorinitializer_list。全力支持動作。

希望這會有所幫助。

+0

這只是通過C風格轉換模糊'const_cast'。 – Ruslan