Sto provando ad implementare una mappa con chiavi di accesso differenti utilizzando modelli variadic in C++. Quello che voglio ottenere è quello di rendere tale lavoro sintassi:Mappa multipla con modelli variadici
MultikeyMap<int, double, float> map1; // int and double are keys, float is value type
map1[ 2 ] = 3.5;
map1[ 5.7 ] = 22;
MultikeyMap<unsigned long long, int, float, double, int> map2; // more keys, int is value type
map2[100000000000ULL] = 56;
// etc...
Quello che ho ora assomiglia:
template<class V, class... Krest>
class MultikeyMap;
template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected std::map<K, V>,
protected MultikeyMap<V, Krest...>
{
public:
template<class T>
void insert(const T& t, const V& v)
{
std::map<T, V>::insert(make_pair(t, v));
}
template<class T>
const V* find(const T& k)
{
typedef std::map<T,V> currentMap;
currentMap::const_iterator it = currentMap::find(k);
return it == currentMap::end() ? 0 : &it->second;
}
};
template<class V>
class MultikeyMap<V>
{};
non ho ritorno iteratori in insert e trovare per rendere il codice semplice.
Vedo due principali difetti in questa soluzione.
Prima il, il tipo di valore va prima nell'elenco degli argomenti del modello. Inizialmente ho provato a scrivere
template<class K, class... Krest, class V>
class MultikeyMap<K, Krest..., V>
ma compilatore insiste che "se un argomento per un modello di classe di specializzazione parziale è un pacchetto di espansione Essa è l'ultimo argomento".
Secondo è l'ereditarietà protetta da std :: maps. Mi piacerebbe molto usare la composizione al posto di quella, ma in quel caso non vedo un modo per accedere alle mappe memorizzate. Se ci fosse un static_if, vorrei scrivere
template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected MultikeyMap<V, Krest...>
{
public:
template<class T>
void insert(const T& t, const V& v)
{
static if(is_same<T,K>::value)
m_map.insert(make_pair(t, v));
else
MultikeyMap<V, Krest...>::insert(t, v);
}
private:
std::map<K,V> m_map;
};
consiglio prega sui problemi che ho citato. Se c'è un approccio migliore, sarò lieto di imparare.
Grazie per la lettura.
'MultikeyMap ':' int' è citato come chiave due volte, è davvero inteso? Come farai a sapere se l'utente sta guardando dal primo o dal secondo 'int'? Inoltre, non è chiaro per me cosa stai cercando di raggiungere; dovrebbe essere presente un valore in tutte le mappe contemporaneamente? Perché se è solo su una mappa non ha senso avere un grande contenitore comune. –
@MatthieuM .: Grazie per il punto, ci dovrebbe essere un int. Il valore dovrebbe essere presente in una mappa per ora, ma in seguito aggiungerò la possibilità di aggiungere un'altra chiave per il valore già memorizzato. –