次のようなコンパイル時のイテレータを実行しようとしています:
meta::reverse_iterator<2, 9>::iterate(callback());
meta::reverse_iterator<4, 7>::iterate(callback());
std::cout << "-----------------" << std::endl;
meta::iterator<2, 9>::iterate(callback());
meta::iterator<4, 7>::iterate(callback());
struct callback {
template <int i>
void operator()() {
std::cout << "print !!" << i << std::endl;
}
};
そして、これは私がメタイテレータを書いた方法です:
namespace meta {
template <int Begin, int End, bool done = false>
struct reverse_iterator {
template <typename F>
static void iterate(F f) {
f.template operator()<End>();
reverse_iterator<Begin, End-1, Begin == End-1>::iterate(f);
}
};
template <int Begin, int End>
struct reverse_iterator<Begin, End, true> {
template <typename F>
static void iterate(F) {}
};
template <int Begin, int End, bool done = false>
struct iterator {
template <typename F>
static void iterate(F f) {
iterator<Begin, End - 1, Begin == End - 1>::iterate(f);
f.template operator()<End - 1>();
}
};
template <int Begin, int End>
struct iterator<Begin, End, true> {
template <typename F>
static void iterate(F) {}
};
}
現在、私はイテレータ呼び出しをoperator()<N>
行っていますが、ユーザーがテンプレート パラメータ (実行時引数としてではなく) を指定して任意の関数を呼び出せるようにしたいのです<N>
が、どうすれば実現できますか?
実際の関数の代わりに bind の関数オブジェクトを呼び出すため、これもboost::bind
機能しません。したがって、提供された関数にデフォルトのパラメーターを渡す方法が必要です。