Boost Metaprogramming ライブラリを使用してそれを試すこともできますが、クラスのテンプレート定義を変更して Boost MPL パラメータ用のスペースを確保する必要があります。
Boost::MPL でやりたいことの例は次のようになります。
#include <boost/mpl/vector.hpp>
#include <boost/mpl/empty.hpp>
#include <boost/mpl/back.hpp>
#include <boost/mpl/pop_back.hpp>
#include <boost/mpl/if.hpp>
#include <iostream>
using namespace boost::mpl;
template<class T>
class Test {
public:
void funcToCall() {
std::cout << "I'm called\n";
}
void update();
};
template<class Y, class T>
struct Update {
static void update(T* t) {
typedef typename pop_back<Y>::type vec_less;
if (back<Y>::type::value > 0)
t->funcToCall();
Update<typename if_<empty<vec_less>, void, vec_less >::type, T>::update(t);
}
};
template<class T>
struct Update<void ,T> {
static void update(T* t) {}
};
template<class T>
void Test<T>::update() {
Update<T, Test<T> >::update(this);
}
int main() {
Test<vector<int_<0>,int_<4>, int_<9> > > t;
t.update();
return 0;
}
クラス「Test」は、元の「TemplatedClass」になります。int テンプレート パラメータのリストを取得する代わりに、boost::mpl::vector である 1 つのパラメータを取得するだけです。これには、渡したいすべての int が含まれており、int が 0 より大きい場合、構造体「Update」から更新メソッドを再帰的に呼び出す update 関数を呼び出します。この関数は、「funcToCall()」メソッドを呼び出す義務があります。
上に貼り付けたプログラムの出力は次のとおりです。
MacBook-Pro-di-Marcello:~ Kariddi$ ./test
私は呼ばれています
私は呼ばれています
もちろん、この例を機能させるには Boost ライブラリが必要です。
MPL に関する情報は、次の場所にあります。
http://www.boost.org/libs/mpl/doc/index.html
乾杯、マルチェロ