2014-03-26 2 views
2

잠재적으로 다른 유형의 비 유형 매개 변수 목록을 사용하는 클래스를 정의하고자합니다. 예를 들어, 다음은 유효해야합니다 :다른 유형의 비 유형 매개 변수가있는 C++ 가변 템플릿

template<int... args> 
class Test { 
    // ... 
}; 

내 특정 사용,보다 구체적으로 :

Test<3, 4.5, 6> t; 

모든 매개 변수가 같은 유형이 있다면, 나는 다음과 같은 정의를 사용할 수, int 말 두 번째 클래스에 많은 멤버가있는 Base이 있는데, 나는 Base 멤버 포인터를 전달하고 싶습니다. Base::aBase::b는 일반적인 유형 T이있는 경우 다음과 같이

Test<&Base::a, &Base::b> 

, 그때 Test을 정의 할 수 있습니다.

template<int Base::* ...args> 
class Test { 
    // 
}; 

어떻게 이러한 클래스를 정의 할 수 있습니까? Test?

+0

그래서 정확히 무엇이 문제입니까? – iavr

+3

필자가 얻을 수있는 최선의 방법은'std :: integral_constant' 또는 유사한 것을 사용하고 템플릿 매개 변수 유형의 팩을 사용하는 것입니다. 그런 다음 보일러 장소를 줄이기 위해 매크로를 사용할 수 있습니다 :'#define C_MEM_FUN (X) std :: integral_constant '그리고'Test ' – dyp

+1

'template '는'template '이어야한다고 생각합니다. – Constructor

답변

5

다음과 같은 방법으로 작업을 수행 할 수 있습니다 간단한 표기법 template <class... Types, Types... args> class Test; 표준에 의해 허용되지 않는다는 것을

template <class... Types> 
struct Wrapper 
{ 
    template <Types... args> 
    class Test { 
     // ... 
    }; 
}; 

주 (참조 단락 [temp.param] 14.1/15).

( float, doublelong double 상수 비 형 템플릿 매개 변수가 될 수 있음에 유의) 사용

예 : 회원 포인터

Wrapper<int, char, unsigned>::Test<1, '2', 3U> t; 

보다 구체적인 사례와 유사하게 구현 될 수있다 :

struct Base 
{ 
    int a; 
    float b; 
    void c() {} 
}; 

template <class... Types> 
struct Wrapper 
{ 
    template <Types Base::*... args> 
    class Test { 
     // 
    }; 
}; 

사용 예 :

Wrapper<int, float, void()>::Test<&Base::a, &Base::b, &Base::c> t2; 

이 표기법은 가변 매크로와 decltype 키워드를 사용하여 단축 할 수 있습니다.

+0

'''decltype'''에 대한 여러분의 의견을 자세히 설명해 주시겠습니까? ''''Wrapper''가 중복 된 이후에 타입 목록을 삭제할 수 있다면 이상적입니다. –

+0

내가 아는 가장 간단한 방법은'std :: make_tuple'의 스타일이다. - 인자에 의존하는 룩업으로 타입을 추론해라. 그 말로, 나는'make_tuple'이이 세상에서 길지 않을지도 모른다는 것을 읽었습니다. C++의 관습에 맞지 않는 무언가가 있습니다. 템플릿 X (T && ...)의 생성자 인수가'X '을 추론하지만, ADL은 유형이 인스턴스화되기 전에 ctor가있는 자체 생성자에서 유형을 조회해야합니다. 추론 할 일반 옵트 인 및/또는 생성자를 지정하는 방법이 필요합니다.이 중 일부는 모두 작업에 포함될 수 있습니다. –

+0

개인적으로 'friend'생성자를 구문으로 사용하고 싶습니다.'friend' 공장을 만들려고 시도했지만 구현이'std :: integral_constant'를 사용하는 방향으로 가고 있다는 것을 깨닫고 std 라이브러리 작성자가 템플릿 서명을 사용했다면 다루기가 어려울 것입니다. –

관련 문제