Я пытаюсь написать функцию, которая отображала бы функцию через несколько итераторов. Это было бы что-то вроде
template <class Fun>
fun_over_variadic_args(Fun fun) { }
template <class Fun, class First, class Rest...>
fun_over_variadic_args(Fun fun, First& first, Rest&... rest) {
fun(first);
fun_over_variadic_args(fun, rest...);
}
namespace {
template <class T> struct thunk_inc {
decltype(T::operator++()) operator()(T& t) { return ++t; }
};
}
template <class Fun, class MainIterator, class RestOfIterators...>
std::tuple<MainIt&, RestOfIts&...> map_over_iterators(Fun fun, MainIt& it, MainIt& end, RestOfIts&... rest) {
const thunk_inc();
for (; it!=end; fun_over_variadic_args(thunk_inc, it, rest...)) {
// Do something
}
}
Тогда возникает проблема, что функция Fun в fun_over_variadic_args должна быть шаблонной, что означает, что она не может быть лямбда-выражением и не может быть объектом локальной функции, что влечет за собой загрязнение глобального пространства имен.
Кто-нибудь знает лучшее решение для этого?
Спасибо
Изменить: Обратите внимание, что я хочу максимально возможную скорость, поэтому предпочтение будет отдаваться решениям, которые сохраняют возможность включения всех вызовов функций.
Edit2: только что понял, что могу использовать анонимные пространства имен, чтобы ограничить область действия Fun одним файлом. Я все еще хотел бы знать более точное решение, хотя, если оно существует.
Альтернативное решение Я обнаружил, что могу применять функцию fun к пакету переменных аргументов, пока я передаю результат другой функции. Поэтому, если у меня есть функция fun, которую я хочу применить к каждому аргументу, я могу сделать что-то вроде
template <class... T>
void foo(T... t) { }
template <class... Arg>
void test(Arg... arg) {
foo(fun(arg)...); // Works!
fun(arg)...; // Doesn't work!
}
Разъяснение альтернативного решения Однако использование этого означает, что веселье не может вернуть пустоту