您可以尝试使用 Boost 元编程库来执行此操作,但需要您更改类的模板定义以为 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;
}
“测试”类将是您原来的“模板类”。现在,您无需获取 int 模板参数列表,而是获取一个 boost::mpl::vector 参数。这包含您要传递的所有整数,然后您调用更新函数,该函数将从结构“Update”中递归调用更新方法,如果整数大于 0,则该方法将有责任调用“funcToCall()”方法。
我上面粘贴的程序的输出是:
MacBook-Pro-di-Marcello:~ Kariddi$ ./test
我叫
我叫
当然,您需要 Boost 库才能使此示例正常工作。
您可以在此处找到有关 MPL 的信息:
http://www.boost.org/libs/mpl/doc/index.html
干杯,马塞洛