Templatura di un nome utente

1

Sto scrivendo una libreria che fornisce grafici per gli algoritmi di ricerca.

Di solito vuoi classificare i nodi usando una coda di priorità. Normalmente vuoi cercare un nodo specifico nella coda e abbassarne la chiave (quando trovi un percorso migliore).

La ricerca sarebbe O (n) a meno che non si conosca l'indice del nodo (è possibile aggiungerlo alla struttura del nodo). L'aggiunta dell'indice al nodo richiede che la coda sia in grado di aggiornare l'indice quando necessario.

Ho problemi a scrivere una coda di priorità generica, perché ho bisogno di sapere dove leggere e scrivere l'indice di un nodo in questa coda. C'è un modo per farlo?

Il codice potrebbe apparire come questo

class SomeNode : Node {
 int indexA;
 int indexB;
}

template <typename N, ?? indexMember>
class Heap{
  update(N node, int key){
    //...
    node.indexMember = i;
  }
}

Heap<SomeNode, 'indexA'> heapA(cmp_A());
Heap<SomeNode, 'indexB'> heapB(cmp_B());

Ci sto chiedendo qui perché penso che il design potrebbe richiedere alcune rielaborazioni piuttosto che una caratteristica probabilmente mancante

    
posta Dietr1ch 02.07.2015 - 15:32
fonte

1 risposta

1

Seguendo la domanda StackOverflow suggerita da Thomas, la risposta dovrebbe essere simile a questa:

class SomeNode : Node {
 int indexA;
 int indexB;
}

template <typename N, int (N::*indexMember)>  // Note the *
class Heap{
  update(N node, int key){
    //...
    node.*indexMember = i;  // Also here
  }
}

Heap<SomeNode, &SomeNode::indexA> heapA(cmp_A());  // Note the ref to the member
Heap<SomeNode, &SomeNode::indexB> heapB(cmp_B());
    
risposta data 03.07.2015 - 04:50
fonte

Leggi altre domande sui tag