2016-11-24 17 views
8

Rõ ràng mã bên dưới không biên dịch trong C++. Nhưng tôi có một trường hợp mà tôi muốn tham số hóa một lớp với số không hoặc nhiều mục dữ liệu dựa trên các tham số mẫu.Khai báo các biến thành viên từ tham số mẫu variadic

Có cách nào tôi có thể khai báo một lớp có thành viên dữ liệu phụ thuộc vào các tham số mẫu của vectơ để tôi có thể truy cập vào từng tham số không? hoặc một số cách khác để đạt được những gì tôi muốn?

Điều này xuất hiện trong một chương trình thực sự mà tôi đã giải quyết một cách hoàn toàn khác nhưng bây giờ tôi quan tâm đến vấn đề trừu tượng hơn về cách tôi có thể làm điều này.

template <typename... Types> class Data 
{ 
    // Declare a variable of each type in the parameter pack 
    // This is NOT valid C++ and won't compile... 
    Types... items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
} 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 
+1

Đáng ngạc nhiên là đủ, điều này không xuất hiện như một bản sao. – MSalters

Trả lời

6

Bạn có thể sử dụng một std::tuple

#include <tuple> 

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
}; 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 

Thử here

+0

Cảm ơn, điều đó thật tuyệt. Tôi sử dụng tuple nhưng bằng cách nào đó nó đã không xảy ra với tôi tôi có thể sử dụng nó với gói tham số mở rộng. – jcoder

6

Tiêu chuẩn này đã giúp bạn. Chỉ cần khai báo std::tuple<Types...> items.

7

Đó là mục đích của std::tuple:

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 
+0

Ah cảm ơn bạn. Đó là một chút xấu hổ, tôi sử dụng tuple nhưng bằng cách nào đó đã không nghĩ rằng để sử dụng nó với một gói mở rộng tham số ở đây. – jcoder

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