Devo sovraccaricare gli operatori aritmetici di base per alcuni oggetti molto complicati che ho creato. Finora, ho implementato con successo operator*
; ora ho bisogno di operator+
, ecc. Il codice per operator*
è molto grande, ma l'unica differenza tra operator*
e operator+
sarà una riga dove uso +
invece di *
su alcuni numeri complessi. Questa linea sarà all'interno di un ciclo che viene chiamato molte volte, quindi voglio che sia efficiente, il che sembra non implicare alcun riferimento a funzioni. (Correggimi se ho torto.)Operatore di passaggio come parametro modello di funzione
Questo sembra un uso perfetto per i modelli. Ma sono in perdita per la sintassi corretta. Sto pensando qualcosa di simile all'interno della definizione di ComplicatedObject
classe:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp(f[i], B.f[i]);
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator*>(B);
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator+>(B);
}
Questa domanda è legata: "function passed as template argument". Ma le funzioni passate come gli argomenti del template non sono operatori.
Ho simulato la sintassi in ogni modo possibile, ma il compilatore si lamenta sempre di una sintassi errata. Come dovrei farlo?
Edit:
Per chiarezza, includo la soluzione completa in termini di mio codice di cui sopra, insieme con le generalizzazioni ulteriori persone possono avere bisogno:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp()(f[i], B.f[i]); // Note extra()'s
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::plus<std::complex<double> > >(B);
}
inline ComplicatedObject operator-(const ComplicatedObject& B) const {
return BinaryOp<std::minus<std::complex<double> > >(B);
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::multiplies<std::complex<double> > >(B);
}
inline ComplicatedObject operator/(const ComplicatedObject& B) const {
return BinaryOp<std::divides<std::complex<double> > >(B);
}
'std :: complex' è un modello di classe, quindi è necessario' std :: complex '. Ma anche allora, 'complesso :: operator *' e 'complesso :: operator +' sono * funzioni membro *. Non puoi semplicemente passarli in giro senza un'istanza di 'complesso ' su cui operare. –
Praetorian
Post errori che stai ricevendo. –
+1 per una domanda interessante. Ho anche trovato questa domanda - [puntatori C++ agli operatori] (http://stackoverflow.com/questions/4176895/c-pointers-to-operators) pertinenti e interessanti. – keelar