c++ - 元编程模板递归不递归(编辑重要)

标签 c++ recursion metaprogramming


我尝试使用元编程递归调用函数 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);
}

输出:

item value: 1, N-1: 2, value: 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);

在循环中。

最佳答案

没有递归。递归就是调用自己。 set您代码中的函数不会执行此操作。

你的 value声明 确实递归(即 GEN<N>::value 是根据 GEN<N -1>::value 定义的)——但以一种非常无趣的方式,它只是传播基本情况值 0——而且你似乎没有无论如何都要使用这个值。

/EDIT:这是一个非常简单的例子来解决你在评论中提出的问题,即实现

的效果
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) 调用此代码它将具有所需的语义。

关于c++ - 元编程模板递归不递归(编辑重要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673883/

相关文章:

c++ - 计算匹配数

java - 如何使用 Jsoup 递归遍历 HTML 树?

c++ - 为具有未知返回类型的可调用启用部分模板特化?

c++ - 为什么编译器不将此标记为错误而不是警告?

c++ - 使用 SWIG 将 vector 公开为内存 View

c++ - Boggle - 实现递归

c++ - 编写程序打印 "Hello, world!"程序

c++ - 循环中的模板元编程?

c++ - 他们为什么不添加 iota 的运营商版本?

java - 工作递归巴比伦平方根,需要合并一个错误。