использование emplace (args & amp; & …) в ассоциативных контейнерах

Я пытаюсь привести некоторые аргументы, чтобы сделать на месте строительство объектов. Я не совсем понимаю обоснование использования emplace в ассоциативных контейнерах или, может быть, я просто неправильно использую / думаю. Было бы замечательно, если бы кто-то мог поделиться фрагментами кода для использования.

В ассоциативном контейнере, таком как map, всегда хранится объект вида pair (), а функция emplace сообщает, что вызовет конструктор сохраненного объекта (для которого всегда есть пара в случае карт) путем пересылки аргументов. Так мы ограничены в предоставлении двух аргументов (ключ, значение), даже если функция имеет переменную сигнатуру?

Когда я использовал emplace с контейнерами boost, прежде чем я смог передать такие аргументы:
emplace (arg1, arg2, arg3, arg4) // где arg2, arg3, arg4 использовались для построения объекта, а arg 1 был ключевым.

при компиляции с новыми gcc-4.6 и c ++ 11 это ломается
Но теперь я должен сделать что-то вроде:
emplace (arg1, myobj (arg2, arg3, arg4)); // заставить работать тот же код;

Таким образом, новый emplace не делает какую-то мудрую конструкцию, как буст? И я ограничен, чтобы предоставить только 2 аргумента для карт, потому что пары всегда будут принимать два аргумента для своих конструкторов.

4

Решение

Таким образом, новый emplace не делает какую-то мудрую конструкцию, такую ​​как буст?

То, что вы называете «кусочной конструкцией», — это не то, что в стандарте называется кусочной конструкцией, а именно:

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.7 с помощью делегирующих конструкторов, не поддерживается GCC 4.6)

7

Другие решения

Это действительно дефект в стандарте, он подробно рассматривается в N3178.

Цитировать,

единственный способ создать объект value_type — это предоставить точно
два аргумента для ключа и значения, пара или
piecewise_construct_t, за которым следуют два кортежа. Оригинальное emplace ()
предложение позволило бы вам указать значение ключа с последующим любым
количество аргументов конструктора для значения. Когда мы удалили
вариадический конструктор для пары, эта способность ушла

статус-кво заключается в использовании piecewise_construct_t, если вы хотите построить объект.

это было закрыто как «NAD»

7

По вопросам рекламы [email protected]