2012-12-03 5 views
4

개체의 내부 구성을 수행하기위한 몇 가지 인수를 전달하려고합니다. 나는 연관 컨테이너에서 emplace의 사용법에 대한 이론적 근거를 얻지 못하거나 잘못된 방식으로 생각하고 사용하고있을 수도 있습니다. 다른 사람이 사용하기 위해 코드 스 니펫을 공유 할 수 있다면 좋을 것입니다.연관 컨테이너에서 emplace (args && ...) 사용

map과 같은 연관 컨테이너는 항상 kind pair()의 객체를 저장하고 emplace 함수는 인수를 전달하여 객체의 생성자 (항상지도의 경우 쌍)를 호출한다고 말합니다. 함수에 가변적 인 서명이 있더라도 두 개의 인수 (키, 값)를 제공하도록 제한됩니까?

인수를 전달하기 전에 emplace와 boost 컨테이너를 사용했을 때 : emplace (arg1, arg2, arg3, arg4) // 여기서 arg2, arg3, arg4는 객체를 구성하는 데 사용되고 arg1은 키입니다.

새로운 GCC-4.6 C++ 11 컴파일이 나누기하지만 지금은 같은 것을 할 필요가 : 에 갖다 두도록 (ARG1,하여 MyObj (ARG2,에서 arg3, arg4을)); // 같은 코드가 작동하도록합니다;

그래서 새로운 emplace는 부스트처럼 현명한 구성을하지 않습니까? 그리고 쌍은 항상 그들의 생성자에 대해 두 개의 인수를 허용하기 때문에지도에 2 개의 인수 만 제공하도록 제한됩니다.

+0

th에 여전히 기능이 있습니다. 표준 라이브러리는 C++ 11을 모두 완벽하게 구현하지 못합니다.첫 번째 버전 ('emplace (key, arg1, arg2, arg3)')이 작동해야합니다. –

+0

'std :: pair'는 [piecewise construction] (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)); 

이 수행 당신이 원하는 정확히 무엇에 인수의 튜플을 전달 첫 번째와 두 번째 pair 회원 (GCC 4.6에서는 각 인수 유형에 대한 접근 가능한 복사 생성자가 필요함을 알고 있어야합니다. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51183 참조 -이 요구 사항은 GCC 4.6에서 지원되지 않는 위임자 생성자를 사용하여 GCC 4.7에서 수정 됨)

+0

@ user179156 답변으로 표시하십시오. – Etherealone

7

이것은 실제로 표준의 결함으로, 길이가 N3178 인 것으로 해결되었습니다.

인용,

VALUE_TYPE의 객체를 생성 할 수있는 유일한 방법은 키와 값, 한 쌍 또는 두 개의 튜플 다음에 piecewise_construct_t에 대해 정확히 이 개 인수를 제공하는 것입니다. 원래 emplace() 제안을 사용하면 Key 값 뒤에개의 값에 대한 생성자 인수를 지정할 수있었습니다. 우리가 짝을 할 수있는 가변 생성자를 제거 할 때,이 기능은 현상 유지는 객체를 구성하려는 경우 piecewise_construct_t를 사용하는 것입니다

... 멀리

갔다.

그것은 closed as "NAD"

+4

그건 .... 그냥. : – Xeo

+0

@ Xeo, 그것은 더 많은 ew를 해결할 것입니다 : _ "고치는 것이 중요하지 않습니다. 제 생각에는 map과 multimap에 대한 emplace()는 여러 오버로드가 필요합니다 : 쌍의 각 오버로드 된 생성자에 대해 하나 (key, valueargs ...) 케이스에 대한 것이고 마지막 케이스가 다른 것들을 덮어 쓰지 않도록 SFINAE 메타 프로그래밍이 필요할 것입니다. "_ –

관련 문제