Forse:
std::multiset<long, std::less<int> > moduloset;
cosa strana da fare, ma il punto è che std::less<int>
, std::less<long>
, std::less<unsigned int>
implementare diverse funzioni matematiche che producono risultati diversi quando viene passato (il risultato della conversione) certe espressioni argomenti. Vari algoritmi e altri componenti delle librerie standard funzionano specificando un funtore, quindi ha senso per me che ci sono diversi funtori per rappresentare quelle diverse funzioni matematiche, non solo diversi sovraccarichi di operator()
su un unico functor.
Inoltre, un funtore con un modello operator()
non può essere un predicato binario adattabile, poiché non ha tipi di argomenti (un argomento può avere qualsiasi tipo). Quindi, se sono stati definiti std::less
come suggerisci, non è possibile partecipare agli elementi in <functional>
.
Anche su una nota altamente speculativa - std::less
è stato progettato probabilmente prima che il supporto per le funzioni membro del modello fosse del tutto diffuso, dal momento che ci sono varie note nella documentazione SGI STL che dicono "se l'implementazione non supporta i modelli membri" allora questo non è disponibile ". Per una componente così semplice, credo che sarebbe un incentivo a fare qualcosa che funzioni oggi. Una volta esistente, la standardizzazione potrebbe essere stata sostituita da in favore di qualcos'altro, ma valeva la pena interrompere il codice esistente? Se era un grosso problema, allora tu o lo standard potreste introdurre un functor flexible_less
mentre descrivete.
Infine, perché
template<class T>
bool operator()(T const& lhs, T const& rhs){
return lhs < rhs;
}
anziché
template<class T, class U>
bool operator()(T const& lhs, U const& rhs){
return lhs < rhs;
}
Per i tipi definiti dall'utente, i due non potrebbero essere lo stesso. Sì, questa è una domanda ingiusta, dal momento che non so perché non ci sia una versione a due template argomento di std::less
;-)
fonte
2011-07-04 22:54:46
a partire da C++ 14, è possibile utilizzare [comparatori trasparenti] (http: // stackoverflow.com/q/20317413/819272) che fornisce 'template std :: less ' con 'std :: less ' contenente l'operatore di testo' '<' (e similmente per gli altri functor). –
TemplateRex