3

std::complex の std::vector が与えられた場合、複素数の実部のみを含むベクトルに変換し、一定の係数で除算したいと思います。今、私はそれをします:

std::vector<std::complex<double> > vec;
std::vector<double> realVec;
double norm = 2.0;
...
for (std::vector<std::complex<double> >::iterator it = vec.begin(), itEnd = vec.end(); it != itEnd; ++it)
    realVec.push_back((*it).real() / norm);

これはもちろん問題なく動作しますが、 std::transform を使用して同じことを行う方法を探しています。私は試した:

transform(vec.begin(), vec.end(), back_inserter(realVec), tr1::bind(divides<double>(), tr1::bind(&complex<double>::real, tr1::placeholders::_1), norm));

しかし、それはうまくいきません。このエラーがあります:

erreur: no matching function for call to ‘bind(<unresolved overloaded function type>, std::tr1::_Placeholder<1>&)’|

「未解決のオーバーロードされた関数型」がある理由がわかりません。

誰かが私に何が悪いのか説明してもらえますか?

4

2 に答える 2

4

残念ながら、少なくとも直接的には、これを行うことはできません。標準ライブラリのメンバー関数 ( などcomplex<double>::real) の型は指定されていないため、実装によって追加のオーバーロードが提供される場合があり、そこにある関数には既定の引数を持つ追加のパラメーターが含まれる場合があります。

実際には、標準ライブラリ メンバー関数のアドレスを取得する移植可能な方法はありません。

あなたの最善の策は、ヘルパー関数を書くことです:

template <typename T>
T get_real(const std::complex<T>& c) { return c.real(); }

それにバインドします:

std::tr1::bind(&get_real<double>, std::tr1::placeholders::_1)
于 2011-04-19T14:24:25.480 に答える
1

std::complex<>::real()オーバーロードされています (cf. C++11 [complex])。

template <typename T>
class complex {
    // ...
    T real() const; // getter
    void real( T ); // setter
    // ...
};

C++ では、オーバーロードされた関数のアドレスを取得するときに曖昧さを解消する必要があります。あなたの場合、あなたは言わなければなりません:

tr1::bind( static_cast<double(std::complex<double>::*)()const>( &std::complex<double>::real ),
           tr1::placeholders::_1 )

はい、これは醜いです。

于 2011-04-19T14:23:29.427 に答える