2012-03-23 27 views
5

Tôi muốn sử dụng các hàm variadic loại an toàn được giới thiệu trong C++ 11, nhưng không phải với các loại khác nhau. Một ví dụ:Các hàm variadic loại an toàn với các tham số cùng loại

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

Các loại tất cả các thông số đều giống nhau, vì vậy nó có lẽ có thể viết một cái gì đó như thế:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

Nó biên dịch với lỗi này trong mingw g ++ 4.5:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

Vì anh ta không biết rằng {5, 6} thuộc loại Point. Giải pháp là gì?

+0

Vui lòng s/variable/variadic/ –

+1

Tôi phải hỏi, liệu dữ liệu của bạn có thực sự được lưu trữ trong nhiều biến không tổng hợp không giống như 'max_element' không phù hợp? –

+0

Không chuyên chức năng, thay vào đó hãy chuyển vị từ. – Xeo

Trả lời

10

Giải pháp là không phải để sử dụng mẫu có định dạng! Khi được sử dụng với các mẫu chức năng, chúng được dùng để suy ra các loại đối số. Đó không phải là những gì bạn muốn làm: bạn muốn các đối số để đưa vào loại dự kiến.

Tôi không có nhiều kinh nghiệm thực tế với điều này nhưng bạn muốn sử dụng danh sách initializer cho việc này:

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

Bạn có thể phàn nàn rằng bạn không thể sử dụng này với các loại tùy ý nhưng sau đó bạn cần phải nhận ra rằng bạn cần phải nói với một nơi nào đó những gì loại có liên quan. ... Và nó có thể được tạo thành một mẫu mặc dù bạn cần phải xác định kiểu đối số.

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