否定的で申し訳ありませんが、あなたの質問は間違った前提から始まります。2011 規格に関してstd::complex
は下位互換性があります。フォームのコード
complex<double> C; cin >> C.real();
有効な C++ではありませんでした。2003年の標準はメンバー関数のみを提供します
T std::complext<T>::real() const;
だがしかし
const T& std::complext<T>::real() const; // non-standard
T& std::complext<T>::real(); // non-standard
一部の実装 (gcc 4.3 に同梱されているものなど) では、代わりにこれら 2 つが実装されている場合があります。
さて、あなたの質問に答えます。明らかに、最もクリーンな方法は、標準の意図に従うことです。2011 規格では、次のセッターが追加されています
void std::complex<T>::real(T);
void std::complex<T>::imag(T);
したがって、これらを使用して、実部または虚部を個別に設定するだけです。
T&
ただし、などの を取る関数では使用できませんoperator>>
。そのためには、次のような厄介なトリックを行う必要があります
template<typename T>
inline T& get_real(std::complex<T>&z) { return reinterpret_cast<T(&)[2]>(z)[0]; }
template<typename T>
inline T& get_imag(std::complex<T>&z) { return reinterpret_cast<T(&)[2]>(z)[1]; }
std::complex<double> z;
cin >> get_real(z) >> get_imag(z);
実際、bames53 のコメントで指摘されているように、標準ではstd::complex
、これが常に機能するようにレイアウトされることが保証されています。