2012-12-03 64 views
4

我想轉發一些參數來進行對象構建。我沒有完全理解在關聯容器中使用emplace的原理,或者我可能只是用錯誤的方式使用/思考。如果有人可以共享代碼片段以供使用,那將會很棒。在關聯容器中使用emplace(args && ...)

聯想容器等地圖總是存儲樣對(的一個目的),而佈設功能說會通過轉發參數來調用所存儲的對象的構造(其爲總是在配對的地圖的情況下)。那麼,即使函數具有可變簽名,我們也僅限於提供兩個參數(鍵,值)嗎?

當我使用升壓容器佈設之前,我可以傳遞參數,如: 佈設(ARG1,ARG2,ARG3,ARG4)// ARG2,ARG3,ARG4被用於構造對象和Arg 1是關鍵位置。新的gcc-4.6和C++編譯11時

,這打破 但現在我需要做的是這樣的: 佈設(ARG1,MyObj中(ARG2,ARG3,ARG4)); //使相同的代碼工作;

因此,新的安置區不會像提升那樣進行任何明智的構建?我是否限制只向地圖提供2個參數,因爲對將始終接受構造函數的兩個參數。

+0

仍然有功能e標準庫沒有完全實現所有的C++ 11。第一個版本('emplace(key,arg1,arg2,arg3)')應該可以工作。 –

+0

'std :: pair'支持[分段構造](http://en.cppreference.com/w/cpp/utility/pair/pair),儘管它看起來不那麼吸引人。 – Cubbi

回答

7

因此,新佈設沒有做任何一件明智的建築像升壓?

您指的是「一塊明智的建設」什麼是不是標準指的是分段建設,這是什麼:

m.emplace(std::piecewise_construct, 
      std::forward_as_tuple<A1>(arg1), 
      std::forward_as_tuple<A2,A3,A4>(arg2, arg3, arg4)); 

這不正是你想要的東西,轉發args來元組第一個和第二個pair成員(但是請注意,對於GCC 4.6,這需要每個參數類型的可訪問拷貝構造函數,請參見http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51183 - 通過使用委託構造函數修正GCC 4.7的此要求,不受GCC 4.6支持)

+0

@ user179156將此標記爲答案。 – Etherealone

7

這實際上是標準中的一個缺陷,它在N3178中詳細討論。

引述,

構建VALUE_TYPE的目的的唯一方式是提供一種用於鍵和值,一對或 piecewise_construct_t後跟兩個元組提供恰好 兩個參數。原來的emplace() 提案可以讓您指定一個Key值,後面跟Value的任何 數量的構造函數參數。當我們刪除了 可變參數的構造函數來配對,這才走了

...

現狀是,如果你想構造一個對象使用piecewise_construct_t。

這是closed as "NAD"

+4

這只是......新聞。 ( – Xeo

+0

@Xeo,修復它會更多ew:_「修復這是非平凡的,我認爲。我認爲map和multimap的emplace()需要幾個重載:一個用於對中的每個重載構造函數,以及一個用於emplace(Key,valueargs ...)的情況,並且可能需要一些SFINAE元編程來確保最後一種情況不會覆蓋任何其他情況。「_ –