繁体   English   中英

元编程模板递归不会递归(重要编辑)

[英]Metaprogramming template recursion doesn't recurse (edited important)


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

循环中。

没有递归。 递归意味着给自己打电话。 您代码中的set函数不会执行此操作。

您的value声明确实会递归(即GEN<N>::value是根据GEN<N -1>::value )–但以一种非常有趣的方式,它只会传播基本情况值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)调用此代码,它将具有所需的语义。

该模板元编程显然递归 ,因为你的代码编译并运行。

您是否期望set函数的递归调用? 您调用的函数GEN<3>::set不会调用任何其他类的set函数,因此没有运行时递归。 只有编译时递归来实例化模板。 但是编译时递归不会在运行时生成输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM