2012-10-15 27 views
5

Tôi đang thử nghiệm với các mẫu variadic và muốn biết nếu họ có thể được sử dụng để generalze (?) Lớp mẫu nhưInitialzing và các thành viên truy cập của một lớp mẫu variadic

template<typename T1, typename T2 , typename T4, typename T4> 
struct Foo 
{ 
    T1  &m_member1; 
    T2  &m_member2; 
    T3  &m_member3; 
    T4  &m_member4; 
}; 

Ngoài ra, tôi muốn có thể khởi tạo tất cả các thành viên bằng cách kết nối các nhà xây dựng. Đây là cách nay tôi đã nhận:

template<typename... Types> 
struct Foo; 

template<typename T , typename... Types> 
struct Foo<T, Types ...> : public Foo<Types ...> 
{ 
    Foo(T member , Types ... others) : m_member(member) , Foo<Types ...>(others) 
    { 
    } 

    T m_member; 
}; 

template<typename T> 
struct Foo<T> 
{ 
    Foo(T member) : m_member(member) 
    { 
    } 

    T m_member; 
}; 

đâu mục tiêu là để tạo các đối tượng như sau:

Foo<char,int,bool,float> f('a' , 42 , true , 1.234); 

Mã này thất bại trong việc biên dịch (gcc 4.5.3) với các lỗi:

TestVariadicTemplates.cpp: In constructor ‘Foo<T, Types ...>::Foo(T, Types ...)’: 
TestVariadicTemplates.cpp:15:83: error: parameter packs not expanded with ‘...’: 
TestVariadicTemplates.cpp:15:83: note:   ‘others’ 
TestVariadicTemplates.cpp:15: confused by earlier errors, bailing out 

Sửa

Điều gì sẽ là cách tốt nhất để tái ference các thành viên khác nhau của Foo?

+3

Bạn đang tìm kiếm cho 'std :: tuple'? – pmr

+0

@pmr Cảm ơn. std :: tuple làm một công việc tuyệt vời. C++ x11 thật tuyệt vời !!! – Olumide

Trả lời

4

Bạn phải làm những gì nó nói: Mở rộng các biến đến từ gói Tham số (các tham số variadic) với ....

Đó là, thay vì

Foo<Types ...>(others) 

ghi

Foo<Types ...>(others...) 
+0

Cảm ơn. Làm thế nào để bạn đề nghị tôi làm điều này. Đây là bước đột phá đầu tiên của tôi vào mẫu variadic. – Olumide

+0

Cảm ơn! Nó đã làm việc!!! – Olumide

+0

@Olumide: [Demo trực tuyến] (http://liveworkspace.org/code/7a9e302e6ec73e49837878b28f65d4dc) – ildjarn

Các vấn đề liên quan