2016-04-25 12 views
7

Tôi muốn tạo ra một lớp mẫu như dưới đây:using std :: tuple để xây dựng một tập dữ liệu vector dựa trên tham khảo variadic-templates

template < typename... Args > class VectorTuple; 

bằng ví dụ,

VectorTuple < long, double, string > 

sẽ instanced như

Tuple < vector <long>, vector <double> , vector <string> > 

Tôi không quen với các mẫu variadic. Phương pháp tồi tệ nhất là sao chép mã từ < tuple> và sửa đổi nó. Có một cách dễ dàng để chỉ trực tiếp sử dụng std :: tuple để xác định VectorTuple của tôi.

Trả lời

6

Nếu bạn đang tìm kiếm typedef các variadic-templates loại sau đó,

template<typename... Args> 
using VectorTuple = std::tuple<std::vector<Args>...>; 

Bây giờ bạn có thể sử dụng nó như

VectorTuple<long, double, std::string> obj; 
3

Bạn có thể sử dụng mở rộng gói thông số để chuyển đổi mẫu variadic tham số gói T... vào std::vector<T1>, ..., std::vector<Tn>. Sau đó, xác định bí danh mẫu với template<...> using.

#include <vector> 
#include <tuple> 

template<typename... Ts> using VT = std::tuple< std::vector<Ts>... >;  

void foo() 
{ 
    VT<int, float, double> x; 
    std::tuple< std::vector<int>, std::vector<float>, std::vector<double>> y = x; 
} 
+0

Ah, mở rộng gói thông số, về tính năng dễ chịu nhất trong tất cả C++. Heh. –

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