很抱歉是否定的,但你的问题是从错误的前提开始的。关于std::complex
2011 标准是向后兼容的。表格代码
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 附带的实现)可能已经实现了这两个。
现在,回答你的问题。显然,最干净的方法是遵循标准的意图。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
布局保证始终有效。