valarray<double>
スカラーで乗算することができます。しかし、valarray<complex<double>>
のスカラーで乗算したいときにエラーが発生します。私はかなりのやり方でそれをする方法があるのだろうかと思っています。ここでは、問題の再現だ:スカラーで複素数のvalarrayを掛ける
valarray<complex<double>> v1{ { complex<double>{1,0}, complex<double>{2,0}, complex<double>{3,0} } };
valarray<complex<double>> v2 = v1 * 2.0; // error
はError C2784: 'std::complex<_Other> std::operator *(const std::complex<_Other> &,const std::complex<_Other> &)': could not deduce template argument for 'const std::complex<_Other> &' from 'std::vector<std::complex<double>,std::allocator<_Ty>>'
を生成します。
だから私はそれが行われ、以下の作品が可能かどうかを確認するために私自身の機能を構築しようとした:
valarray<complex<double>> VAMult(const valarray<complex<double>> &v, double scalar)
{
valarray<complex<double>> out(v.size());
for (size_t i = 0; i < v.size(); i++)
{
out[i] = v[i] * scalar;
}
return out;
}
// makes the following code work:
valarray<complex<double>> v2 = VAMult(v1, 2.0);
しかし、私はvalarray.hに見て、見つかったので、この実装は本当に醜いコードのためになるだろう*オーバーロードの定義:
operator*(const _Ty& _Left,
const valarray<_Ty>& _Right)
{ // return scalar * valarray
_VALOP(_Ty, _Right.size(), _Left * _Right[_Idx]);
}
#define _VALOP(TYPE, LENGTH, RHS) /* assign RHS(_Idx) to new valarray */ \
valarray<TYPE> _Ans(LENGTH); \
for (size_t _Idx = 0; _Idx < _Ans.size(); ++_Idx) \
_Ans[_Idx] = RHS; \
return (_Ans)
私のテンプレートに関する知識は非常に限られていますが、このクラスを拡張することは可能ですか?ここに私の試みです:
Error C2039 '*': is not a member of 'std::valarray<std::complex<double>>'
その結果
valarray<complex<double>> valarray<complex<double>>::operator*(const double &scalar)
{
return valarray<complex<double>>{};
}
ので、コードv1 * 2.0
作品や、いくつかの近くの妥協の私の最初の行を、それを作るための方法はありますか?
私はこれを試したことができましたが、2番目と3番目の値はランダムでした。私の限られた範囲では、これは許容される妥協点です。 –