2010-01-25 4 views

답변

4

C++ 03에는 가변성 템플릿이 없습니다. 이것은 예를 의미합니다. 당신은 그저 올라가고 그걸로 살아 가려면 단순히 N을 골라야 만합니다. C++ 0X에서

, 거기에 당신이 번호를 쉽게 변경하기 위해 찾고 있다면 당신은 모든 X.

에 대해 하나의 정의를 사용할 수 있도록 Boost.Preprocessor을 사용할 수 있습니다, 가변 인자 템플릿하고 그것을 할 것입니다 당신을위한 작업 :

#define MAXIMUM_TYPELIST_SIZE 20 // or something 

struct empty{}; 

template <BOOST_PP_ENUM_BINARY_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T, =empty)> 
struct typelist; 

template <BOOST_PP_ENUM_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T)> 
struct typelist 
{ 
    typedef T1 head; 
    typedef typelist< 
      BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(MAXIMUM_TYPELIST_SIZE), T)> tail; 
    enum 
    { 
    length = tail::length+1 
    }; 
}; 

MAXIMUM_TYPELIST_SIZE 만일 그 매크로의 기사가 무슨으로 확장 할 5이었다.

(당신이 부스트를 사용하는 경우 물론, 단지 사용 자신의 meta-programming library.)

+0

그게 사실은 내가 자신의 튜토리얼 밖에 Boost.PP의 첫 번째 수용 가능한 읽을 사용 보았다. –

+0

@ gf : 하하.: P이 ("variadic"템플릿)과 다른 질문에서 나에게 지적한 카운터는 지금까지 두 가지 실제 사용법뿐입니다. – GManNickG

1

현재 표준에서 정확합니다. 템플릿은 고정 된 수의 인수 만 가질 수 있으며 라이브러리는 전 처리기 메타 프로그래밍과 같은 기술을 사용하여 가변적 인 템플릿 매개 변수를 특정 최대 값까지 시뮬레이트합니다. 일반적으로 이것은 대부분의 사람들이 사용하는 것보다 훨씬 더 높게 설정되어 있으므로 실제로는별로 문제가되지 않습니다.

새로운 0x 표준에는 실제 가변 매개 변수 매개 변수가 지원됩니다.

2

예 - 라이브러리의 구현에 의해 설정된 일부 제한이 있습니다. IIRC, Loki의 최대 값은 기본적으로 99입니다. 그 기사를 보니 그는 한계를 5 번으로 잡았는데, 아마도 많은 일을하기에 충분할 것입니다. 그러나 나는 그것을 초과 할 가능성을 보았습니다. 나는 로키가 허용하는 99 점을 초과한다고 상상할 수는 없다. (어느 쪽이든 원하는 경우 한도를 연장하는 것은 사소한 편집 작업 임에도 불구하고).

2

을 가변 인자 템플릿 지원하지 않고, 템플릿 저자는 가변 인자 템플릿과 같이 해결 방법을 제공 할 수 있습니다

template<class Arg1=nil, class Arg2=nil /* , ... */> 
struct foo {}; 

을 여기를 작성자가 제공하는 템플릿 인수의 수는 제한 사항입니다.

typedef list<T1, list<T2, list<T3, nil> > > myTypeList; 
foo<myTypeList>::bar; 

이이 유형의 고정 된 수의 제한되지 않습니다

들이는 작업 차선책을 제공하지 않을 경우

, 당신은에 비해 상당히 서투른있는 명시 적 typelists,에 의존하도록 강요 할 것 ,하지만 명시 적으로 사용하고 싶은 것은 아닙니다. 이 다음 C++ 표준과

는 사실 가변 인자 템플릿을 사용하여 해결할 수 :

template<class... Args> // can take 0..n arguments 
struct foo {}; 
관련 문제