我尝试使用元编程以递归方式调用函数void set(...)
问题是它似乎只调用一次。
template <int N>
struct GEN
{
enum {value = GEN<N-1>::value};
template <typename T>
static inline void set(T& tup, int l_item)
{
cout<<"item value: "<<l_item<<", N-1: "<< N-1 << ", value: "<<value <<endl;
typedef typename boost::tuples::element<N-1, T>::type _el_type;
get<N-1>(tup) = atomic_item<N-1, _el_type>(l_item);
};
};
template<>
struct GEN<0>
{
enum {value = 0};
template <typename T>
static inline void set(T& tup, int l_item)
{
typedef typename boost::tuples::element<0, T>::type _el_type;
get<0>(tup) = atomic_item<0, _el_type>(l_item);
};
};
main(){
....
/** this is how i try to invoke it */
GEN<3>::set(w,1);
}
输出:
项目值:1,N-1:2,值:0
函数只被调用一次......
修改
有没有办法用for_each或其他任何东西进行循环来获得类似的东西:
for_each<range_c<int,0,3> f{operator()(T i)GEN<typename T::value>::set(w,1)}>
或者类似的东西来实现对所有这些元素的调用?
特别是我想要这个:
GEN<3>::set(w,1);
GEN<2>::set(w,1);
GEN<1>::set(w,1);
循环播放。
答案 0 :(得分:2)
没有递归。递归意味着称呼自己。代码中的set
函数不执行此操作。
您的value
声明确实递归(即GEN<N>::value
是根据GEN<N -1>::value
定义的) - 但是以一种非常无趣的方式,它只是传播了基础case值,0 - 而且你似乎还没有使用这个值。
/编辑:这是一个非常简单的例子来解决你在评论中提出的观点,即实现
的效果GEN<3>::set(w,1);
GEN<2>::set(w,1);
GEN<1>::set(w,1);
这实际上非常简单:
template <unsigned N>
struct GEN {
template <typename T>
static void set(T& w, int value) {
// Do something, e.g.:
get<N - 1>(w) = value;
// Recurse:
GEN<N - 1>::set(w, value);
}
};
template <>
struct GEN<0> {
template <typename T>
static void set(T&, int) { /* empty */ }
};
现在,您可以通过GEN<3>::set(w, 1)
调用此代码,它将具有所需的语义。
答案 1 :(得分:1)
元编程模板显然在您的代码编译和运行后已经递归。
您是否期望对set
函数进行递归调用?您调用的函数GEN<3>::set
不调用任何其他类的set
函数,因此没有运行时递归。只有编译时递归来实例化模板。但编译时递归不会在运行时生成输出。