2017-05-19 5 views
2

가변 인자 템플릿 인수로서 포인터를 멤버에 전달할 수 있습니까? 구문을 파악할 수없는 것 같습니다. 이처럼 사용할 수가변성 템플릿 매개 변수로서의 멤버에 대한 포인터

struct A 
{ 
    int a; 
    float b; 
} 

template <typename ... TArgs> void f(A *obj, TArgs ... params) 
{ 
    void *members[] { (&(obj->*params))... }; 
    // ... do something ... 
} 

가 : 함수에 대한

는 다음과 같이 작동 전화

f(obj, &A::a, &A::b); 

내가 클래스 템플릿에 비슷한 방식으로 PARAMS를 전달하고자

template <[something] ... params> class Foo 
{ 
    void Bar(A *obj) 
    { 
     void *members[] { (&(obj->*params))... }; 
     // ... do something ... 
    } 
}; 

이렇게 사용해야합니다.

Foo<&A::a, &A::b> foo; 
foo.bar(obj); 

무엇이 있어야하는지 파악하는 데 문제가 있습니다. 회원 유형이 알려진 하나 개의 매개 변수가있는 경우

, 그것은 다음과 같이 수행 할 수 있습니다

template <int A::*ptr> //... 

는 회원이 다른 알 수있는 멤버 포인터의 가변 매개 변수 목록이 일반화 할 수있는 방법이 있나요 미리 유형?

업데이트 : 고정 알려진 형식의 멤버 포인터에 대한 가변 인자 인수 팩과 같이 선언한다 :

template<int A::*...ptr> struct Foo {}; 

지금 난 그냥 추론 할 수있는 유형 이름으로 INT를 교체해야합니다.

그리고 C++ (17)와 완벽하게 작품을 다음

template<auto A::*...ptr> struct Foo {}; 

는 불행하게도, 난 C++ 14

+0

아마도'template '? – Zereges

+0

불행히도 컴파일되지 않습니다. – Ghostrider

답변

3

++ (14) C에서, 다른 레벨을 사용할 수와 함께 작동 할 수있는 솔루션을 필요로 (당신이 언급 한 바와 같이, 비 형식 템플릿 매개 변수에 대한 C++ 17에서 도입)

struct A { 
    int a; 
    float b; 
}; 

template<typename... T> 
struct Bar { 
    template <T A::*... params> 
    struct Foo { 
     void Bar(A *obj) { 
      void *members[] { (&(obj->*params))... }; 
      // ... do something ... 
      (void)members; 
     } 
    }; 
}; 

int main() { 
    A a; 

    Bar<int, float>::Foo<&A::a, &A::b> foo; 
    foo.Bar(&a); 
} 

auto 키워드가 문제의 다소 이런 종류의 해결 : 간접으로 그렇게합니다. std::integral_constant을 생각해보십시오. 그리고 매번 타입을 첫 번째 인자로 지정할 필요가 없다면 어떻게 더 사용자 친화적일까요?