Это то, к чему сводится мой код, с функцией emplace, которая не компилируется, но, надеюсь, поможет вам понять, чего я пытаюсь достичь:
Код: Выделить всё
template
class MyContainer
{
public:
template
void emplace(ArgsA&&... argsA, ArgsB&&... argsB)
{
// do custom logic
a_container.emplace_back(std::forward(argsA)...);
b_container.emplace_back(std::forward(argsB)...);
}
private:
std::vector a_container;
std::vector b_container;
};
Итак, используя std::tuple, проблему можно разложить на несколько разных шагов. На каждом этапе мне необходимо обеспечить сохранение характера аргументов (r-значение или l-значение):
- передать аргументы для размещения в кортеже
- прочитать кортеж из моей функции emplace
- распаковать кортеж
- передать распакованные элементы кортежа в emplace_back(..)
Пункт 2. доставляет небольшое неудобство. То есть переписывание emplace для приема std::tuple:
Код: Выделить всё
template
void emplace(std::tuple tupleA, std::tuple tupleB)
Более того, я думаю, что способ передачи std::tuple может привести к странному поведению. Выше я написал «ленивую версию», которая принимает std::tuple путем копирования, но в большинстве случаев, когда я пишу контейнер, я предпочитаю, как и стандарт, использовать как версию const std::tuple&, так и версию std::tuple&& для максимальной гибкости. В этом случае версия const std::tuple& будет иметь std::get для извлечения только версии наших аргументов с l-значениями из-за правил свертывания ссылок, что противоречит сути. Поэтому я подумываю о написании только std::tuple&& и (возможно) о сохранении копии.
Пункты 3. и 4. являются самыми трудными. Я считаю, что мне придется решать их вместе, и я очень удивлен, что стандарт, насколько я понимаю, предлагает std::forward_as_tuple, но не обратную операцию. Здесь есть тонкая проблема, которая не позволяет использовать простое решение пересылки с использованием такого кода:
Код: Выделить всё
template
void emplace(std::tuple tupleA, std::tuple tupleB)
{
// do custom logic
a_container.emplace_back(std::forward(std::get(tupleA))...);
...
Я особенно ищу более простые решения для пунктов 3. и 4.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -arguments
Мобильная версия