Come posso aggiungere tale funzione membro map
per la mia interfaccia collection<T>
?
La risposta breve è: non è così. Se ho un po 'di collection<int>
e voglio map
std::to_string
su di esso, ho bisogno di produrre un collection<std::string>
. Ma un vector_collection<int>
deve produrre un numero vector_collection<std::string>
e un list_collection<int>
deve produrre un list_collection<std::string>
- in modo che la trasformazione del tipo debba essere virtual
ized. Ma non puoi avere modelli di funzioni membro virtual
, quindi non c'è modo di esprimerlo.
Per far sì che funzioni, è necessario disporre di un tipo di base comune per tutti gli oggetti che si stanno inserendo nel contenitore e quindi avere solo una facciata comune tra cui si può effettuare il cast. Cioè, in realtà hai solo collection<unique_ptr<Object>>
dove map
ti dà solo un diverso collection<unique_ptr<Object>>
, e tu solo map
il tuo collection_facade<int, collection<unique_ptr<Object>>>
in un collection_facade<std::string, collection<unique_ptr<Object>>>
. Con un sacco di lavoro e totale disprezzo per le prestazioni e la sicurezza del tipo, potresti arrivarci.
Questo è il vantaggio dei modelli. Se voglio scrivere map
per qualcosa come vector
, posso solo scrivere che:
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;
}
o:
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)
);
}
devo implementare map()
per ogni contenitore a parte - ma avrei dovuto farlo Comunque. E ora non sto dando nulla. Inoltre, quanto spesso stai scrivendo algoritmi che sono runtime-container-agnostici?
Cosa c'è che non va nei contenitori standard C++? –
@ πάντα ῥεῖ OP sta cercando di fare questo per scopi di apprendimento credo. –
niente voglio sapere come implementare una cosa del genere per scopi educativi – Exagon