Tóm tắt: Do sử dụng thông số mẫu mẫu có hạn chế hơn * sử dụng thông số loại mà không cung cấp bất kỳ lợi thế nào.
* Bằng "hạn chế", tôi có nghĩa là bạn có thể cần một công cụ phức tạp hơn để có được kết quả tương tự với thông số loại "đơn giản".
Tại sao không có lợi thế?
bạn std::stack
lẽ đã là một thuộc tính như thế này:
template <typename T, typename Container>
struct stack {
Container container;
};
Nếu bạn thay thế Container
, bởi một mẫu tham số mẫu, tại sao bạn có được?
template <typename T, template <typename...> class Container>
struct stack {
Container<T> container;
};
Bạn đang instantiating Container
chỉ một lần và chỉ cho T
(Container<T>
), do đó không có lợi thế cho một tham số mẫu template.
Tại sao nó hạn chế hơn?
Với một tham số template mẫu, bạn phải vượt qua để std::stack
một mẫu mà phơi bày cùng một chữ ký, ví dụ:
template <typename T, template <typename> class Container>
struct stack;
stack<int, std::vector> // Error: std::vector takes two template arguments
Có lẽ bạn có thể sử dụng các mẫu variadic:
template <typename T, template <typename....> class Container>
struct stack {
Container<T> container;
};
stack<int, std::vector> // Ok, will use std::vector<int, std::allocator<int>>
Nhưng những gì nếu tôi không muốn sử dụng tiêu chuẩn std::allocator<int>
?
template <typename T,
template <typename....> class Container = std::vector,
typename Allocator = std::allocator<T>>
struct stack {
Container<T, Allocator> container;
};
stack<int, std::vector, MyAllocator> // Ok...
Điều này trở nên lộn xộn một chút ... Nếu tôi muốn sử dụng các mẫu chứa của riêng mình có thông số 3/4/N thì sao?
template <typename T,
template <typename... > class Container = std::vector,
typename ...Args>
struct stack {
Container<T, Args...> container;
};
stack<int, MyTemplate, MyParam1, MyParam2> // Ok...
Nhưng, điều gì sẽ xảy ra nếu tôi muốn sử dụng vùng chứa không có templated?
struct foo { };
struct foo_container{ };
stack<foo, foo_container> // Error!
template <typename... >
using foo_container_template = foo_container;
stack<foo, foo_container_template> // Ok...
Với một số loại không có vấn đề như vậy :
stack<int>
stack<int, std::vector<int, MyAllocator<int>>
stack<int, MyTemplate<int, MyParam1, MyParam2>>
stack<foo, foo_container>
Có những trường hợp khác mà không làm việc với template mẫu tham số như sử dụng mẫu chấp nhận một kết hợp của nhập và loại thông số không theo thứ tự cụ thể, mà bạn có thể tạo tham số mẫu chung chung, ngay cả khi sử dụng mẫu variadic.
@CoryKramer câu hỏi này không trùng lặp với câu hỏi được liên kết: Câu hỏi được liên kết hỏi về nơi chúng tôi cần đặt mẫu/tên tệp, trong khi câu hỏi này là lý do tại sao lớp hiện tại ('deque') có giao diện nhất định, không phải về câu hỏi cú pháp. – bennofs
Các giá trị mặc định có hoạt động ngay cả đối với các tham số mẫu của mẫu không? – anatolyg
@anatolyg Có, chúng hoạt động. –