2011-01-12 3 views
0


메타 프로그래밍을 사용하여 재귀 적으로 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

기능 회만 호출 한 ...

EDIT

거기에 f와 같은 종류의 루프를 수행하는 방법이 있습니다. 또는 뭔가 simmilar :

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); 

합니다.

답변

2

재귀가 없습니다. 재귀는 자신을 부르는 것을 의미합니다. 코드에서 set 함수는 이 아니고이 아닙니다. 하지만 꽤 재미 방법으로, 그냥 기본 케이스 값 0을 전파 - - 그리고 또한이를 사용하지 않는 것

귀하의 value 선언 같이 Recurse (즉 GEN<N>::valueGEN<N -1>::value의 관점에서 정의된다) 수행 어쨌든 가치.

/편집 : 이제 당신을

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); 
GEN<2>::set(w,1); 
GEN<1>::set(w,1); 

의 효과를 달성하기 위해 즉, 코멘트에 당신에 의해 제기 된 점을 해결하기 위해 매우 간단한 예제이다 GEN<3>::set(w, 1)을 통해이 코드를 호출 할 수 있으며 원하는 의미를 갖습니다.

+0

for_each 또는 다른 어떤 것을 얻기 위해 루프를 수행하는 방법이 있습니다. for_each GEN :: set (w, 1) }> 또는 뭔가 simmilar? – bua

+0

@bua : 전혀 모르겠다. 나는'range_c'로 일한 적이 없다. 하지만'for_each'가 컴파일 타임에 확장되지 않았기 때문에 (그리고 내가 부스트를 볼 때까지) 작동하는지 의심 스럽습니다.MPL은 이에 대한 적절한 메커니즘을 제공하지 않습니다.) 하지만 당신은 * 올바른 코드에서 재귀 호출을 삽입 할 필요가 있습니다. (당신을 도울 수는 없지만'atomic_item을 모르므로 코드가 무엇을하는지 이해하지 못합니다. . GEN <1> :: 설정 (w, 1); 에서 (1 승) GEN <2> :: 설정,' –

+0

@Kondrad는 지금은 (1 승) GEN <3> :: 세트를 달성하고 싶습니다 루프. – bua

1

코드가 컴파일되어 실행 되었기 때문에 메타 프로그래밍 템플릿은 분명히 이되었습니다.

set 함수의 재귀 호출을 기대 했습니까? 호출 한 함수 GEN<3>::set은 다른 클래스의 set 함수를 호출하지 않으므로 런타임 재귀가 없습니다. 템플릿을 인스턴스화하는 컴파일 타임 재귀 만 있습니다. 그러나 컴파일 타임 재귀는 런타임에 출력을 생성하지 않습니다.

관련 문제