Domanda

Sto scrivendo una tabella hash per la mia classe di strutture di dati e vorrei aggiungere un po 'di zucchero sintattico alla mia implementazione.

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

Funziona bene quando faccio qualcosa come cout < < dict [quot &; mykey quot &;]. Ma come posso fare un incarico tra parentesi? Qualcosa del tipo:

dict["mykey"] = "something";

E no, questo non fa parte del mio compito (nessun gioco di parole), voglio solo imparare un po 'meglio il C ++.

È stato utile?

Soluzione

Non è chiaro cosa stai chiedendo esattamente qui. Il codice che hai presentato supporta già l'assegnazione. Fallo e funzionerà (o almeno dovrebbe compilare). Non fa assolutamente alcuna differenza su quale lato dell'operatore di assegnazione viene utilizzato il sovraccarico []. Funzionerà esattamente allo stesso modo sul lato sinistro (LHS) come sul lato destro (RHS) dell'incarico (o come operando di <<, come nel tuo post originale). Il tuo Object restituisce un riferimento a un lookup, quindi l'assegnazione effettiva viene gestita dall'operatore di assegnazione del tuo tipo NULL, il che significa che std::map stesso non è realmente coinvolto nell'assegnazione effettiva.

La vera domanda qui è come vuoi che il tuo const HashedObj& agisca in determinati casi speciali. Cosa succederà se la tua chiave non è presente nella tabella? Riferimento a quale HashedObj il tuo <=> tornerà in questo caso?

È impossibile capire cosa hai pubblicato. Vedo che restituisce un riferimento, quindi restituire <=> è fuori discussione. Inserisce un nuovo <=> vuoto per la chiave fornita? Se è così, allora non devi fare nulla. Il tuo <=> è già perfettamente pronto per essere utilizzato sull'LHS dell'assegnazione. (Ecco come funziona <=> in <=>, BTW)

Nel caso in cui <=> restituisca un riferimento a un " speciale; guard " <=>, devi fare passi speciali. Probabilmente non vuoi assegnare nulla a un & Quot; guard & Quot; oggetto, quindi devi " disabilitare " il suo operatore di assegnazione in qualche modo e il gioco è fatto. Il resto dovrebbe funzionare così com'è.

Se <=> genera un'eccezione nel caso di una chiave inesistente, allora devi decidere se questo è ciò che desideri quando <=> viene utilizzato sull'LHS di un compito. In tal caso, non è necessario fare nulla. In caso contrario, ci vorrà un po 'di lavoro extra ...

Quindi, di nuovo, cosa succede se si passa una chiave inesistente a <=>?

P.S. Inoltre, sarebbe normalmente più sensato dichiarare il <=> (e <=>) con <=> parametro o solo <=> parametro. I riferimenti non costanti, come nel tuo esempio, sembrano strani e potrebbero portare a problemi in alcuni (in realtà, nella maggior parte dei casi). Sono sorpreso che funzioni per te ora ...

Altri suggerimenti

Devi sovraccaricarlo 2 volte. Uno che sarà const, che sarà la data access parte, e uno che restituirà un riferimento, che fungerà da & Quot; setter & Quot ;.

Quello che stai cercando è una funzionalità simile all'operatore del bracketing sovraccarico in std::map. In std::map<K,V> mymap l'operatore parentesi quadre esegue una ricerca e restituisce un riferimento a un oggetto associato a una chiave particolare. Se la mappa non contiene alcun oggetto associato alla chiave, l'operatore inserisce un nuovo oggetto nella mappa utilizzando il costruttore predefinito.

Quindi, se hai mymap[someKey], quindi chiamare someKey restituirà un riferimento al valore associato a V, oppure creerà un nuovo oggetto di tipo V() chiamando <=> ( il costruttore predefinito di V) e quindi restituire un riferimento a quel nuovo oggetto, che consente al chiamante di assegnare un valore all'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top