Mi piaceva la soluzione di KeithB con funzioni gratuite. Tuttavia, una soluzione più riutilizzabile potrebbe essere piacevole.
Che dire di oggetti funzione che l'accesso prima o la seconda, come si può assegnare un nome al nulla le istanze che ti piace:
#include <map>
#include <string>
#include <iostream>
struct GetFirst
{
template <class First, class Second>
First& operator()(std::pair<First, Second>& p)
{
return p.first;
}
template <class First, class Second>
const First& operator()(const std::pair<First, Second>& p)
{
return p.first;
}
};
struct GetSecond
{
template <class First, class Second>
Second& operator()(std::pair<First, Second>& p)
{
return p.second;
}
template <class First, class Second>
const Second& operator()(const std::pair<First, Second>& p)
{
return p.second;
}
};
int main()
{
typedef std::map<std::string, int> Map;
Map persons;
persons["John"] = 20;
persons["Mary"] = 24;
//create named accessors
GetFirst name;
GetSecond age;
for (Map::iterator it = persons.begin(); it != persons.end(); ++it) {
std::cout << name(*it) << " is aging.\n";
++age(*it);
}
for (Map::const_iterator it = persons.begin(); it != persons.end(); ++it) {
std::cout << "Name: " << name(*it) << ", age: " << age(*it) << '\n';
}
}
questo è il meglio che potessi fare. Ho anche provato a far sì che quei funtori accettino direttamente l'iteratore, ma in un modo o nell'altro ciò significa che la firma conterrà nomi dipendenti che apparentemente rendono impossibile la deduzione del tipo di modello (non ho trovato il modo di sovraccaricare GetSecond per iterator/const_iterator
anche con il ritorno differito tipo di C++ 0x).
Divertente: al momento ci sono molte domande relative al grafico: http://stackoverflow.com/questions/1499878/use-a-graph-library-node-network-library-or-roll-my- proprio, http://stackoverflow.com/questions/1499217/boost-graph-as-basis-for-a-simple-dag-graph –
Perché non puoi usare boost? –