2012-03-12 44 views
16

Tôi hiện đang phải vật lộn với đoạn mã sau, mục đích của nó là để thực hiện variadic variadic mẫu mẫu:variadic mẫu variadic mẫu

template 
< 
    template <typename... HeadArgs> class Head, 
    template <typename... TailArgs> class... 
> 
struct join<Head<typename HeadArgs...>, Head<typename TailArgs...>...> 
{ 
    typedef Head<typename HeadArgs..., typename TailArgs......> result; 
}; 

Lý tưởng nhất, tôi muốn có thể sử dụng mẫu này để đạt được metafunction sau đây:

template <typename...> struct obj1 {}; 
template <typename...> struct obj2 {}; 

typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj1<char*, int, double, const char*> 
>::result new_obj1; 

typedef join 
< 
    obj2<int, int, double>, 
    obj2<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj2; 

/* This should result in an error, because there are 
    different encapsulating objects 
typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj; 
*/ 

Đầu ra của trên sẽ hy vọng tạo new_obj1new_obj2 theo hình thức template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

Tôi đang sử dụng gcc 4.6.2 trên Windows, kết quả này xuất ra "gói thông số dự kiến ​​trước '...'" để mở rộng "Head<typename TailArgs...> ...".

This error is reproducable with gcc 4.5.1.

+0

Đối số * Tên * bên trong 'template' đặc điểm kỹ thuật của mẫu mẫu đối số là tùy chọn và hoàn toàn mỹ phẩm; nó không thực sự có sẵn như là một tham số thực. –

+0

@KerrekSB có cách nào để lấy tham số của tham số mẫu mẫu không? – kmore

+0

Tôi đã chỉnh sửa bài đăng của mình; Tôi đã thiếu trường hợp variadic. Trong câu trả lời cho câu hỏi của bạn: Có, bằng cách cung cấp một tham số mẫu rõ ràng (gói) và khớp. –

Trả lời

18

Hãy thử một cái gì đó như thế này:

template <typename...> struct join; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2> 
struct join<Tpl<Args1...>, Tpl<Args2...>> 
{ 
    typedef Tpl<Args1..., Args2...> type; 
}; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2, 
      typename ...Tail> 
struct join<Tpl<Args1...>, Tpl<Args2...>, Tail...> 
{ 
    typedef typename join<Tpl<Args1..., Args2...>, Tail...>::type type; 
}; 
+0

Đó là một giải pháp hoàn hảo khi kết hợp các tham số của hai đối tượng. Tuy nhiên, tôi đang tìm cách kết hợp các tham số của một số lượng các đối tượng. Tôi đã thử [sửa đổi] (http://ideone.com/njBuE) câu trả lời của bạn, nhưng vẫn có lỗi với gói mở rộng. ** EDIT: bạn đánh bại tôi với nó, cảm ơn bạn! ** – kmore

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