2012-09-05 2 views
3

C++ 2011 코드에서 까다로운 일이 필요합니다. 현재, 내가 이런 종류의 metafunction 있습니다부호없는 int의 가변 템플릿을 재귀 적으로 작성하십시오.

template<unsigned int N, unsigned int M> 
static constexpr unsigned int myFunction() 

이 기능은 수 NM에 따라 생성 할 수 있습니다.

입력 NM으로 메타 기능을 작성하고 싶습니다.이 템플릿은 M을 감소시켜 가변적 인 템플릿을 재귀 적으로 생성합니다.

List... = myFunction<N, 3>, myFunction<N, 2>, myFunction<N, 1>, myFunction<N, 0> 

방법 (이것은 물론 가능하다면) 그 작업을 수행하는 예를 들어, M = 3이 함수를 호출하여, 그것은 동일한 List라는 가변 인자 템플릿을 만들 것인가?

template<int N, int M, typename T> struct foo_impl {}; 
template<int N, int M, int... I> struct foo_impl<N, M, tuple_pack<I...>> { 
    static void foo() { 
     int arr[M] = { myFunction<N, M - I>()... }; 
    } 
}; 
template<int N, int M> void foo() { 
    foo_impl<N, M, typename make_tuple_pack<M>::type>::foo(); 
} 

원하는 경우 함수 매개 변수 추론 :

// Idiomatic tuple pack generator using successor method 
template<int... I> struct tuple_pack { 
    using succ = tuple_pack<I..., sizeof...(I)>; 
}; 
template<int N> struct make_tuple_pack { 
    using type = typename make_tuple_pack<N - 1>::type::succ; 
}; 
template<> struct make_tuple_pack<0> { 
    using type = tuple_pack<>; 
}; 

지금 우리가 구현 기능에 위임, 튜플 팩 생성기를 적용 할 수 있습니다

+0

목록의 유형은 무엇입니까? –

+0

목록은 서명되지 않은 int 목록입니다 – Vincent

+1

유스 케이스를 말할 때 즉 사용 방법을 말할 때 더 좋습니다. 또한 단순히 함수 이름'myFunction '은 괄호 없이는 아무 것도 의미하지 않습니다. 사용 사례가있는 좀 더 정교한 예제가 도움이 될 것입니다. –

답변

4

은 기존의 튜플 팩 생성기를 사용하는 것이 아마도 가장 간단한이다 클래스 템플릿 전문화에이 또한 쓸 수 :

template<int N, int M, int... I> void foo_impl(tuple_pack<I...>) { 
    int arr[M] = { myFunction<N, M - I>()... }; 
} 
template<int N, int M> void foo() { 
    foo_impl<N, M>(typename make_tuple_pack<M>::type{}); 
} 

배열 크기를 int arr[M]으로 지정해야했습니다. 팩 확장 초기화 프로그램에 표준에서 요구되는지 여부 또는 gcc의 버그인지 여부는 확실하지 않습니다. 어느 쪽이든 큰 번거 로움이 없습니다.

관련 문제