2010-06-17 42 views
7

làm thế nào tôi có thể chèn các đối tượng lớp của riêng mình vào ptr_map để tăng cường. Các đối tượng được templated vì vậy tôi không thể sử dụng một số typename tĩnh trong bản đồ. Vì vậy, tôi đã làm:Tăng cường việc sử dụng

ptr_map<string, any> someMap; 

Lớp học của tôi được thừa hưởng các tăng :: noncopyable.

someMap.insert("Test", new MyClass<SomeTemplate>()); 

Lỗi này là: lỗi: no matching function for call to ‘boost::ptr_map.


UPD: tôi muốn thực hiện một số wrapper và không sử dụng bất kỳ đẩy mạnh ::. Vì vậy:

class IWrapper { }; 
class MyClass : public IWrapper { }; 

ptr_map<string, IWrapper> someMap; 
someMap.insert("Test", new MyClass<SomeTemplate>()); 

Tại sao nó không hoạt động (cùng một lỗi)? Tôi có thể vượt qua lớp kế thừa vào giao diện cha. Chuyện gì vậy?

Trả lời

3

Cho đến nay, hầu hết các vấn đề thời gian thuộc loại này phải được giải quyết với một lớp cơ sở chung. Đây là trường hợp khi tất cả các lớp sẽ được sử dụng tương tự. Đa hình thời gian chạy.

Tôi đã thấy lý do chính đáng để không cho phép lớp cơ sở chung. Trong trường hợp này, boost::variant thường sẽ hoạt động tốt hơn vì vẫn có phương pháp để xử lý từng mục thống nhất (khách truy cập). Biên dịch đa hình thời gian.

Tôi chưa bao giờ thấy sử dụng hợp pháp cho boost::any. Tôi không nói rằng không có một, nhưng nó là rất hiếm mà tôi đã không bao giờ gặp phải nó.


Điều đó nói rằng, hãy thử điều này.

std::map<std::string,boost::any> someMap; 
boost::any insanity = new MyClass<SomeTemplate>; 
someMap.insert("Test",insanity); 

hoặc

boost::ptr_map<std::string,boost::any> someMap; 
boost::any* ive_lost_it = new boost::any(new MyClass<SomeTemplate>); 
someMap.insert("Test", ive_lost_it); 
+0

Clas của tôi được tô điểm. Tôi đã cập nhật mẫu. Tôi không thể làm cho một số cơ sở cho nó (không có mẫu). – Ockonal

+0

Ok, cảm ơn. Cách với bất kỳ nên làm việc. Nhưng bạn có thể xem xét cập nhật mã mới không? Tôi đã cố gắng để thực hiện ý tưởng đầu tiên của bạn. – Ockonal

1

Trước tiên, bạn phải cung cấp bất kỳ * để ptr_map của bạn.
Sau đó, khóa phải là một lvalue (do các vấn đề ngoại lệ-an toàn).

boost::ptr_map<std::string, any> someMap; 
any * p = new any(MyClass<Sometype>); 
std::string test = "test"; 
someMap.insert(test, p); 

- sửa
Cùng một điều nếu bạn đang sử dụng một lớp wrapper. khóa phải là một lvalue. Bằng cách này, vấn đề với lớp bao bọc/cơ sở ở đây là bạn sẽ không thể quay trở lại kiểu gốc (và bạn không có đa hình động vì kiểu mẫu).

+0

'lvalue' có nghĩa là gì? Bạn có thể cho thấy một số mẫu? – Ockonal

+0

lvalue có nghĩa là có thể gán (và không phải const). "test" là không thể gán và const, std :: string test tuy nhiên là một lvalue. – log0

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