Я видел, как люди решают эту проблему, имея размер в качестве параметра шаблона и передавая std :: index_sequence в качестве одного из параметров, но std :: map :: emplace () не имеет такого подхода, поэтому должен быть способ реализовать внедрение без этого.
Это правда, что std::map::emplace()
не получают std::index_sequence
, но я не знаю, если внутри, создать std::index_sequence
и вызвать вспомогательную функцию для правильного управления кортежем.
Другими словами, вы можете написать что-то следующее
Key k { make_object_from_tuple<Key>(first_arg, std::index_sequence_for<Args1...>{}) };
и внутри make_object_from_tuple()
вы можете использовать std::index_sequence
для извлечения элемента из кортежа и создания объекта Key
.
Другими словами: как предлагается из Kerndog73, вы можете скопировать реализацию std::make_from_tuple_impl()
в этой странице .
Если вы не хотите разрабатывать новую функцию, вы можете использовать кусочный конструктор из std::pair
.
Ничто не заставляет вас строить std::pair<Key, Value>
: если вы хотите построить сначала Key
и, только если необходимо, рядом с Value
, вы можете построить до std::pair<Key, int>
и после (в случае) a std::pair<Value, int>
.
Я имею в виду ... вы можете создать Key
без Value
std::tuple<int> ti{0};
Key k { std::pair<Key, int>{std::piecewise_construct_t, first_args, ti).first };
и после, только если вам это нужно, Value
Value v { std::pair<Value, int>{std::piecewise_construct_t, second_args, ti).first };