2011-10-16 37 views
26

Có thể có tham số mẫu tùy chọn trong C++, ví dụTùy chọn tham số Template

template < class T, class U, class V> 
class Test { 
}; 

Ở đây tôi muốn người dùng sử dụng lớp này hoặc với V hoặc không V

là sau có thể

Test<int,int,int> WithAllParameter 
Test<int,int> WithOneMissing 

Nếu Có cách thực hiện việc này.

Trả lời

24

Bạn có thể có mặc định mẫu tranh cãi, đó là đủ cho mục đích của bạn:

template<class T, class U = T, class V = U> 
class Test 
{ }; 

Bây giờ công việc sau đây:

Test<int> a;   // Test<int, int, int> 
Test<double, float> b; // Test<double, float, float> 
27

Chắc chắn, bạn có thể có mẫu mặc định các thông số:

template <typename T, typename U, typename V = U> 

template <typename T, typename U = int, typename V = std::vector<U> > 

Thư viện tiêu chuẩn thực hiện điều này tất cả các thời gian - hầu hết container mất 2-5 thông số! Ví dụ, unordered_map thực sự là:

template< 
    class Key,      // needed, key type 
    class T,       // needed, mapped type 
    class Hash = std::hash<Key>,  // hash functor, defaults to std::hash<Key> 
    class KeyEqual = std::equal_to<Key>, // comparator, defaults to Key::operator==() 
    class Allocator = std::allocator<std::pair<const Key, T>> // allocator, defaults to std::allocator 
> class unordered_map; 

Typicall bạn chỉ sử dụng nó như std::unordered_map<std::string, double> mà không cho nó bất kỳ suy nghĩ thêm.

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