2011-10-24 9 views
4

기본적으로 boost :: function이하는 것과 같이 다양한 템플릿 변수 길이를 갖는 템플릿 클래스를 선언하기 위해 부스트 전 처리기를 사용하고 싶습니다.boost :: function이 다른 길이의 템플릿 매개 변수를 사용하여 템플릿 클래스를 지원하는 방법

#if !BOOST_PP_IS_ITERATING 

#ifndef D_EXAMPLE_H 
#define D_EXAMPLE_H 
#include <boost/function> 
#include <boost/preprocessor/iteration/iterate.hpp> 
#define BOOST_PP_ITERATION_PARAMS_1 (3, (1, 2, "example.h")) 
#include BOOST_PP_ITERATE() 

#else 
template<class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class T)> 
class Example 
{ 
    boost::function<T, (BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T))> func; 
}; 
#endif 

동일한 헤더 파일에서 다른 템플릿 변수 길이로 동일한 클래스를 선언하기 때문에 위의 코드는 분명히 작동하지 않습니다. 내가 성취하고자하는 것은 단일 파일을 포함시키고 boost :: function처럼 다양한 템플릿 변수 길이를 가진 클래스들을 정의하는 것이다.

#include "example.h" 
Example<int, int, float> example1; 
Example<double, int> example2; 

나는 boost :: function 코드를 찾았지만 어떻게 작동하는지 알 수 없다. 어떤 아이디어?

+0

가변성 템플릿을 사용하면 어떻게됩니까? –

+0

나는 vs2010에서 일하고있다. 가변적 인 템플릿 – Jason

+0

을 지원하지 않는다. 참고로, boost :: function <>'은 하나의 템플릿 인자를 취한다. – ildjarn

답변

1

첫 번째 매개 변수를 제외한 모든 매개 변수의 기본값을 사용하여 가장 많이 매개 변수가있는 템플릿 클래스를 먼저 선언해야합니다. 그런 다음 매개 변수가 적은 템플릿 클래스를 기본 템플릿 클래스의 특수화로 정의 할 수 있습니다. 예 :

#include <iostream> 

template<class A, class B = void, class C = void> 
class Example 
{ 
public: 
    static const int x = 3; 
}; 

template<class A, class B> 
class Example<A, B, void> 
{ 
public: 
    static const int x = 2; 
}; 

template<class A> 
class Example<A, void, void> 
{ 
public: 
    static const int x = 1; 
}; 

int main() 
{ 
    Example<int, int, int> e3; 
    Example<int, int> e2; 
    Example<int> e1; 
    std::cout << e3.x << e2.x << e1.x << std::endl; 
} 
+0

이것은 내가 원한다, 고마워! 하지만 전 부스트 전처리기를 사용하여 모든 템플릿을 자동으로 생성 할 수 있다고 생각합니까? 이러한 템플릿을 수동으로 작성하는 것은 오류가 발생하기 쉽습니다. – Jason