Làm cách nào để thêm chức năng thành viên map
cho giao diện collection<T>
của tôi?
Câu trả lời ngắn gọn là: bạn không. Nếu tôi có một số collection<int>
và tôi muốn map
std::to_string
vào nó, tôi cần phải tạo ra một collection<std::string>
. Nhưng cần có vector_collection<int>
để tạo ra một vector_collection<std::string>
và list_collection<int>
cần phải tạo ra một list_collection<std::string>
- do đó bản thân loại chuyển đổi đó cần phải là virtual
bị đóng băng. Nhưng bạn không thể có virtual
mẫu chức năng thành viên, vì vậy không có cách nào để diễn tả điều này.
Để làm việc này, bạn sẽ phải có một loại cơ sở chung cho tất cả các đối tượng bạn đang đặt trong vùng chứa của bạn và sau đó chỉ có một mặt tiền chung mà bạn có thể bỏ qua. Tức là, bạn thực sự chỉ có collection<unique_ptr<Object>>
trong đó map
chỉ cung cấp cho bạn collection<unique_ptr<Object>>
khác và bạn chỉ cần map
collection_facade<int, collection<unique_ptr<Object>>>
của mình vào một collection_facade<std::string, collection<unique_ptr<Object>>>
. Với rất nhiều công việc và hoàn toàn không quan tâm đến hiệu suất và loại an toàn, bạn có thể đến đó.
Đây là lợi thế của mẫu. Nếu tôi muốn viết map
cho một cái gì đó giống như vector
, tôi chỉ có thể viết rằng:
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
std::vector<R, A> mapped;
mapped.reserve(v.size());
for (T const& elem : v) {
mapped.push_back(f(elem));
}
return mapped;
}
hay:
template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
return std::vector<R, A>(
boost::make_transform_iterator(v.begin(), f),
boost::make_transform_iterator(v.end(), f)
);
}
tôi phải thực hiện map()
cho mỗi thùng chứa riêng - nhưng tôi sẽ phải làm điều đó dù sao. Và bây giờ tôi không đưa ra bất cứ điều gì. Bên cạnh đó, bạn có thường xuyên viết các thuật toán có thời gian chạy-container-bất khả tri không?
Có gì sai với các thùng chứa tiêu chuẩn C++? –
@ πάντα ῥεῖ OP đang cố gắng làm điều này cho mục đích học tập tôi đoán. –
không có gì tôi chỉ muốn biết làm thế nào để thực hiện một điều như vậy cho mục đích giáo dục – Exagon