実際には少し前と同じようにコード化されました。だから、次のコードを試してみてください。
template<unsigned N, unsigned M>
struct call_up_impl{
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator& mutator, const Tuple& args, Args&&... unpacked_args) {
call_up_impl<N-1, M>::do_call(func, mutator, args, std::get<N-1>(args), std::forward<Args>(unpacked_args)...);
}
};
template<unsigned M>
struct call_up_impl<0, M> {
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator&, const Tuple&, Args&&... unpacked_args) {
func(std::forward<Args>(unpacked_args)...);
}
};
template<unsigned M>
struct call_up_impl<M, M> {
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator& mutator, const Tuple& args, Args&&... unpacked_args) {
call_up_impl<M-1, M>::do_call(func, mutator, args, mutator(std::get<M-1>(args)), std::forward<Args>(unpacked_args)...);
}
};
template<int i, typename Function, typename... Parms>
void apply(Function f, Parms... parms) {
std::tuple<Parms...> t(parms...);
call_up_impl<std::tuple_size<decltype(t)>::value, i + 1>::do_call(f, &g, t);
}
これは私の元のコードの迅速な適応ですので、これを行うにはいない最適な方法を徹底的にテストし、そうでないかもしれないされていないが、それは少なくとも、(少なくとも動作するはずですクイックテストによると正確に何が欲しいかによる)。タプルなしでこれを行うことは可能ですが、g ++でコンパイルすることはできません(入れ子になったバリデーショナルなテンプレートが必要なのではないようです)。おそらくタプルによって導入されたオーバーヘッドのほとんどを避けることができます
template<int i, typename Function, typename... Parms>
void apply(Function f, Parms&&... parms) {
std::tuple<Parms&&...> t(std::forward<Parms>(parms)...);
call_up_impl<std::tuple_size<decltype(t)>::value, i + 1>::do_call(f, &g, t);
}
:しかしにapply
を変更します。 std::get
コールの結果を正確に転送する方が良いかもしれませんが、私はあまりにも疲れています。
piはmath.hのM_PIとして入手できます。残りの部分についてはわかりませんが、より省略記号の少ないコードを投稿できますか? –
@HansPassant私はOPが 'pi 'によって' ith-parameter'を意味すると思っています –
@HansPassant C++は今や全面的に行きました。あなたはもうコードを一切書く必要はありません!省略記号は実際にコードで実行されています! –