내가 작성한 일부 매우 복잡한 객체에 대해 기본 산술 연산자를 오버로드해야합니다. 지금까지 성공적으로 구현했습니다 operator*
; 이제 operator+
등이 필요합니다. operator*
의 코드는 매우 큽니다. 그러나 operator*
과 operator+
사이의 유일한 차이점은 복소수에 *
대신 +
을 사용하는 한 줄이됩니다. 이 라인은 여러 번 호출되는 루프 내부에있을 것이므로 효율적 이길 바란다. 이것은 함수 포인터를 암시하는 것처럼 보일 것이다. (내가 틀렸다면 수정 해주세요.)연산자를 함수 템플릿 매개 변수로 전달
이것은 템플릿을 사용하는 것처럼 보입니다. 그러나 나는 정확한 구문에 관해서는 손해보고있다. 나는 ComplicatedObject
클래스 정의 내부에서 이런 일을 생각하고 있어요 :
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);
}
이 질문은 관련이있다 : "function passed as template argument". 그러나 템플릿 인수로 전달 된 함수는 연산자가 아닙니다.
내가 생각할 수있는 모든 방법으로 구문을 살펴 보았지만 컴파일러는 항상 잘못된 구문을 사용합니다. 어떻게해야합니까?
편집 :
명확하게하기 위해, 나는 사람들이해야 할 수 있습니다 추가 일반화와 함께 위의 내 코드의 측면에서 완벽한 솔루션 포함 :
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'는 클래스 템플릿이므로'std :: complex'이 필요합니다. 하지만 그때도'complex :: operator *'와'complex :: operator +'는 * 멤버 함수 *입니다. 조작하려면'complex '인스턴스를 사용하지 않고 전달할 수 없습니다. –
Praetorian
게시 오류가 발생했습니다. 흥미로운 질문에 대해서는 –
+1. 또한이 질문 - 관련성이 높고 흥미로운 [연산자에 대한 C++ 포인터] (http://stackoverflow.com/questions/4176895/c-pointers-to-operators)를 발견했습니다. – keelar