Muszę przeciążyć podstawowe operatory arytmetyczne w przypadku bardzo skomplikowanych obiektów, które utworzyłem. Do tej pory pomyślnie wdrożyłem operator*
; teraz potrzebuję operator+
itd. Kod dla operator*
jest bardzo duży, ale jedyną różnicą między operator*
i operator+
będzie jedna linia, w której używam +
zamiast *
dla niektórych liczb zespolonych. Linia ta będzie znajdować się wewnątrz pętli, która jest wywoływana wiele razy, więc chcę, aby była wydajna, co wydaje się nie sugerować żadnych wskaźników funkcji. (Popraw mnie, jeśli się mylę.)Przekaż operator jako parametr szablonu funkcji
Wydaje się to być idealnym zastosowaniem do szablonów. Ale brak mi właściwej składni. Myślę, że coś takiego się wewnątrz definicji ComplicatedObject
klasy:
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);
}
To pytanie jest związane: "function passed as template argument". Ale funkcje przekazane jako argumenty szablonu nie są operatorami.
Miałem do czynienia ze składnią w każdy możliwy sposób, ale kompilator zawsze skarży się na złą składnię. Jak mam to zrobić?
Edit:
Dla jasności, ja to kompletne rozwiązanie w zakresie mojego kodu powyżej, wraz z dodatkowymi uogólnień ludzie mogą potrzebować:
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' to szablon klasy, więc potrzebujesz' std :: complex '. Ale nawet wtedy, 'complex :: operator *' i 'complex :: operator +' są * funkcjami składowymi *. Nie możesz po prostu przekazać ich bez instancji 'complex ' do działania. –
Praetorian
Wysyłaj błędy, które otrzymujesz. –
+1 za interesujące pytanie. Też znalazłem to pytanie - [wskaźniki C++ do operatorów] (http://stackoverflow.com/questions/4176895/c-pointers-to-operators) istotne i interesujące. – keelar