Как добавить функцию map
для моего интерфейса collection<T>
?
Короткий ответ: вы этого не делаете. Если у меня есть collection<int>
, и я хочу map
std::to_string
на нем, мне нужно создать collection<std::string>
. Но vector_collection<int>
необходимо произвести vector_collection<std::string>
, а list_collection<int>
необходимо создать list_collection<std::string>
- так что преобразование типа должно быть virtual
ized. Но у вас не может быть virtual
шаблонов функций-членов, поэтому нет способа выразить это.
Для того, чтобы это сработало, вам необходимо иметь общий базовый тип для всех объектов, которые вы помещаете в свой контейнер, а затем просто иметь общий фасад, который вы можете использовать между ними. То есть у вас действительно есть только collection<unique_ptr<Object>>
, где map
просто дает вам другой collection<unique_ptr<Object>>
, а вы только map
collection_facade<int, collection<unique_ptr<Object>>>
в collection_facade<std::string, collection<unique_ptr<Object>>>
. С большой работой и полным пренебрежением к производительности и типу безопасности вы можете добраться туда.
Это преимущество шаблонов. Если я хочу написать map
что-то вроде vector
, я могу просто написать, что:
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;
}
или:
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)
);
}
Я должен реализовать map()
для каждого контейнера отдельно - но я бы это сделать так или иначе. И теперь я ничего не даю. Кроме того, как часто вы пишете алгоритмы, которые являются агентами runtime-container-agnostic?
Что случилось с стандартными контейнерами C++? –
@ πάντα ῥεῖ ОП пытается сделать это для учебных целей, я думаю. –
ничего не хочу знать, как реализовать такую вещь для образовательных целей – Exagon