関数を複数の反復子にマップする関数を作成しようとしています。それは次のようなものになります
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_over_variadic_args の関数 Fun をテンプレート化する必要があるという問題が発生します。これは、ラムダにすることも、グローバル名前空間を汚染するローカル関数オブジェクトにすることもできないことを意味します。
誰かがこれに対するより良い解決策を知っていますか?
ありがとう
編集:すべての関数呼び出しをインライン化する可能性を維持するソリューションが優先されるように、可能な限り最大の速度が必要であることに注意してください。
Edit2:匿名の名前空間を使用して、関数 Fun のスコープを 1 つのファイルに制限できることに気付きました。解決策が存在する場合でも、より適切な解決策を知りたいです。
代替ソリューション結果を別の関数に渡す限り、関数 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!
}
代替ソリューションの明確化ただし、これを使用すると、 fun は void を返すことができません