Я пытаюсь использовать шаблоны в C++, чтобы сделать следующее:Замена типа внутри кортежа в C++ 11
У меня есть функция, как это:
template<typename... Args>
void f1(const std::tuple<Args...>& t1);
Внутри этой функции, Я хотел бы создать еще один набор t2, так что каждый элемент t1 будет скопирован в t2 в том же положении, за исключением элементов типа A, для которых t2 должен создать объект типа B.
Однако конструктор B
принимает ссылку на объект типа A
, а также - второй аргумент типа C&
. Экземпляр C
создается перед преобразованием и должен передаваться как второй аргумент конструктору B
всякий раз, когда встречается объект типа A
.
Нечто подобное, только полностью обобщается:
std::tuple<int, B, double, B> Convert(std::tuple<int, A, double, A> tpl, C& c)
{
return std::tuple<int, B, double, B>(
std::get<0>(tpl),
B(std::get<1>(tpl), c),
std::get<2>(tpl),
B(std::get<3>(tpl), c),
);
}
Хорошо, а с какой проблемой вы столкнулись? SO не является бесплатным местом аутсорсинга. –
Я не зашел очень далеко; в других местах моего кода мне приходилось писать код шаблона, который манипулирует кортежами, например, применяя функцию, беря серию аргументов в кортеж, содержащий поля тех же типов, что и аргументы (делая обратное, то есть преобразовывая ряд аргументы в кортеж, это просто), поэтому я продолжаю пытаться найти способ сделать это, полагая, что мне дан кортеж t1, или что у меня есть ряд аргументов, но я никуда не хожу ... – sunmat
Если бы этого глупого элемента 'C &' не было, это было бы относительно легко метапрограммировать (если у вас есть доступ к C++ 14, конечно). Но поскольку это ограничение существует, оно становится безумно трудным, так как выражения, которые вы используете для построения каждого значения, теперь * разные *, в зависимости от типа этого значения. Вы должны найти способ нормализовать выражение, которое требует создания 'tuple'-in-a-'tuple' или чего-то еще. –