私が作った非常に複雑なオブジェクトの基本的な算術演算子をオーバーロードする必要があります。これまでのところ、私は首尾よくoperator*
を実装しました。今度はoperator+
などが必要です。operator*
のコードは非常に大きいですが、operator*
とoperator+
の唯一の違いは、複素数に*
の代わりに+
を使用する1行になります。この行は、何度も呼び出されるループの内部にあるので、私はそれを効率的にしたいと思います。これは関数ポインタを暗示しているようです。 (私が間違っている場合は私を訂正してください)オペレータを関数のテンプレートパラメータとして渡す
これはテンプレートには最適です。しかし、私は正しい構文については迷っています。
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"私は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]); // 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