Я пытаюсь написать функцию преобразования, которая принимает в качестве входных данных
- функтор, число этих аргументов совпадает с числом входных данных
tuple
с. - произвольное число
tuple
s
и выводит преобразованные tuple
.
Мы предполагаем, что входные кортежи имеют одинаковый тип.
Например, следующий фрагмент кода должен выполнить операцию плюс кортежей, в результате чего tuple
из {5, 7, 9}
.
auto t = transform(
[](auto i, auto j) {
return i + j;
},
std::make_tuple(1, 2, 3),
std::make_tuple(4, 5, 6));
Код :
#include <tuple>
#include <type_traits>
#include <iostream>
template <size_t idx, typename... Ts>
using get_nth_type = std::tuple_element_t<idx, std::tuple<Ts...>>;
template <typename Func, size_t... indices, typename... Ts>
auto transform(Func f, std::index_sequence<indices...>, Ts&&... input) {
return std::make_tuple(f(std::get<indices>(std::forward<Ts>(input))...)...);
}
template <typename Func, typename... Ts>
auto transform(Func f, Ts&&... input) {
return transform(f, std::make_index_sequence<std::tuple_size<get_nth_type<0, Ts...>>::value>(),
std::forward<Ts>(input)...);
}
int main() {
auto t = transform(
[](auto i, auto j) {
std::cout << i + j << '\n';
return -i;
},
std::make_tuple(1, 2, 3), std::make_tuple(4, 5, 6));
// Desired output: 5
// 7
// 9
std::cout << std::get<0>(t) << ", " << std::get<1>(t) << ", " << std::get<2>(t);
// Desired output: -1
// -2
// -3
}
Сообщение об ошибке :
error: pack expansion does not contain any unexpanded parameter packs
return std::make_tuple(f(std::get<indices>(std::forward<Ts>(inputs))...)...);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Кажется, что indices
и input
расширены в неправильном порядке. Но я не могу понять, каков правильный путь.
Попробуйте здесь