2015-12-16 19 views
8

xem xét lớp này chứa đặc biệt lưu trữ các kiểu có chứa cả hai chìa khóa và giá trị bên trong nó, vì vậyTemplate với giá trị mặc định của tham số con trỏ phương pháp

template<typename K, typename T, K (T::*method)() const> 
class Container 
{ 
//... 
}; 

K là loại một chìa khóa, T là một loại giá trị và con trỏ phương thức được sử dụng để truy xuất khóa từ giá trị.

Nó hoạt động tốt nhưng tôi muốn bao gồm một mặc định cho con trỏ phương pháp để khi nó không được quy định bởi người gọi nó sẽ là operator K() const như vậy:

template<typename K, typename T, K (T::*method)() const = &T::operator K const> 

nhưng điều này không biên dịch nêu có là no member operator const K on A (<- my class I test this with) khi tôi cố gắng khởi tạo nó (và có một phương thức như vậy). Thậm chí có thể có giá trị mặc định của đối số mẫu con trỏ phương thức không? Nếu có, cú pháp chính xác là gì?

EDIT: Ngoài các giải pháp dưới đây có một "sửa chữa" cho các trường hợp khi T là một con trỏ có sử dụng tính năng mới C++ 11 std::remove_pointer<T>::type, vì vậy:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K> 
+1

Ý tưởng là [về nguyên tắc] (http://ideone.com/fgtF5y). Nó có thể chỉ là vấn đề đánh vần tên của hàm cụ thể (hàm chuyển đổi) một cách chính xác. –

+2

[Có] (http://ideone.com/k1bCEJ), có thể xóa 'const'? –

+1

'toán tử K const' (==' toán tử const K') sẽ là hàm chuyển đổi thành 'const K'. –

Trả lời

5

Tên của hàm chỉ là operator K. Trình độ của nó không phải là một phần của tên. Hãy thử:

template <typename K, 
      typename T, 
      K (T::*method)() const = &T::operator K> 
//         ^^^^^^^^^^^^^^ 
+2

Điểm tốt: tên của thành viên * không * liên quan đến vòng loại (hoặc đối số). Nếu nó là cần thiết để giải quyết một tình trạng quá tải, mà cần phải được thực hiện thông qua việc chuyển đổi sang một con trỏ thành viên thích hợp (đó là, thuận tiện, có sẵn trong trường hợp này). –

+0

Phải, tất nhiên. Bây giờ nó hoạt động trừ khi tôi sử dụng con trỏ tới T làm đối số. Tôi đoán chuyên môn nên giúp đỡ với điều đó mặc dù. – Resurrection

+0

Và tôi đã tìm ra các trường hợp khi T là con trỏ. Đã thêm dưới dạng chỉnh sửa cho OP. – Resurrection

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