L'intestazione <algorithm>
fornisce std::equal_range()
, così come alcuni contenitori che lo hanno come funzione membro. Ciò che mi infastidisce di questa funzione è che restituisce una coppia di iteratori, rendendola noiosa da iterare dall'inizio iteratore alla fine iteratore. Mi piacerebbe essere in grado di utilizzare std::begin()
e std::end()
in modo da poter utilizzare il ciclo for-based basato su intervallo C++ 11.Posso specializzare std :: begin e std :: end per il valore restituito di equal_range()?
Ora, ho sentito informazioni contraddittorie per quanto riguarda specializzata std::begin()
e std::end()
- Mi è stato detto che l'aggiunta di qualsiasi cosa per i risultati std namespace in un comportamento indefinito, mentre ho anche stato detto che è possibile fornire le proprie specializzazioni di std::begin()
e std::end()
.
Questo è quello che sto facendo in questo momento:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
E questo funziona: http://ideone.com/wHVfkh
Ma mi chiedo, quali sono i lati negativi di fare questo? C'è un modo migliore per farlo?
Esattamente quanto 'schizzinoso' è la parte su cui è consentito se sono coinvolti tipi definiti dall'utente? La coppia contiene iteratori che iterano su un contenitore di unique_ptrs al mio tipo definito dall'utente. –
Le tue definizioni, come scritte, non menzionano alcun tipo definito dall'utente. Questi modelli potrebbero essere istanziati con tipi definiti dall'utente, ma questo è irrilevante. –
In ogni caso, il "escape dipende dai tipi definiti dall'utente" si applica solo alle specializzazioni del modello. I vostri non sono: sono modelli di funzioni primarie, che capita di sovraccaricare altri modelli di funzioni con lo stesso nome. –