2013-07-28 3 views
2

이러한 요소로 반복 할 수있는 이기종 요소로 일부 가변 템플릿 컨테이너 클래스를 구현해야합니다. 내 첫번째 생각은 가변 인수 표준 : : 튜플의 멤버 클래스를 만들이지만, (루프를 통해) 배열과 같은 방식으로 튜플의 요소를 얻는 것은 불가능하다 :Variadic 템플릿 이기종 컨테이너

struct A {void prnt(){std::cout<<"A\n";} };  
struct B {void prnt(){std::cout<<"B\n";} };  
struct C {void prnt(){std::cout<<"C\n";} }; 

template<typename...Arg> 
struct Prc 
{ 
    Prc() : NumElems(sizeof...(Arg)), mems(std::make_tuple(Arg()...)){} 

    int NumElems; 
    std::tuple<Arg...> mems; 

    void process() 
    { 
     for(int i=0; i<NumElems; ++i) 
     std::get<i>(mems).prnt();//It's forbidden: "i" must be a constant 
    } 
}; 

int main() 
{ 
    Prc<A,B,C> obj; 
    obj.process(); 
} 

어떤 아이디어?

P.

struct A { void print() { clog << "A" << endl; } }; 
struct B { void print() { clog << "B" << endl; } }; 
struct C { void print() { clog << "C" << endl; } }; 

template<unsigned N> 
struct iter 
{ 
    template<typename T> 
    static void f (T &t) 
    { 
     iter<N-1>::f (t); 
     get<N> (t).print(); 
    } 
}; 

template<> 
struct iter<0> 
{ 
    template<typename T> 
    static void f (T &t) 
    { 
     get<0> (t).print(); 
    } 
}; 

그리고 호출 코드 : 나는 부스트 :: 변형 또는 부스트 :: 여기에 어떤

+2

(http://loungecpp.wikidot.com/tips-and-tricks:indices) – Xeo

+0

난 당신이 "무슨 뜻인지 모르겠어요 거대한 방식 "이라고 말했다. – jsp

답변

3

여기가 끝났다 사용하여 모든 인덱스 : [. 지수]

namespace detail 
{ 
    template <int... Is> 
    struct index { }; 

    template <int N, int... Is> 
    struct gen_seq : gen_seq<N - 1, N - 1, Is...> { }; 

    template <int... Is> 
    struct gen_seq<0, Is...> : index<Is...> { }; 
} 

template <typename...Args> 
struct Prc 
{ 
    std::tuple<Args...> mems; 

    template <int... Is> 
    void process(detail::index<Is...>) 
    { 
     auto l = { (std::get<Is>(mems).prnt(), 0) ... }; 
    } 

    void process() 
    { 
     process(detail::gen_seq<sizeof...(Args)>()); 
    } 
}; 
+0

"네임 스페이스 세부 정보"를 바꿀 수없는 이유는 무엇입니까? 이 경우에는 컴파일되지 않습니다. – gorill

+0

@gorill 죄송합니다. 원본 코드에서 몇 가지 실수를 저질렀습니다. 나는 내 대답을 업데이트했다. – 0x499602D2

+0

괜찮아요))) 나는 그들을 발견했다)))) – gorill

1

처럼 사용 부스트 이종 컨테이너를 원하지 않는 것은 튜플을 반복 할 몇 가지 코드

tuple <A,B,C> t; 
    iter<tuple_size<decltype(t)>::value-1>::f (t); 

여러분의 필요에 맞게 수정할 수 있다고 생각합니다. 코드의 NumElements는 컴파일 타임에 알려 지므로 해당 멤버를 모두 삭제해야합니다.

관련 문제