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_obj1
và new_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.
Đố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. –
@KerrekSB có cách nào để lấy tham số của tham số mẫu mẫu không? – kmore
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. –