我正在寻找一个函数,该函数返回对 C++11 中复数的 real 或 imag 值的引用。在 C++03 中,我可以说:complex<double> C; cin >> C.real();
但是在 C++11 中,由于 C.real() 返回的是一个值而不是引用,这给了我一个编译错误。
我发现我可以这样写:double t; cin >> t; C.real(t);
但这并不简单,例如,如果我想将 c 的实部乘以 2 并将其乘以 1,我应该说:C.real(2*C.real() + 1);
那不干净。
有没有其他[干净]的方法来做到这一点?
最佳答案
很抱歉否定,但您的问题始于错误的前提。关于 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 标准增加了以下 setter
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
的布局使其始终有效。关于c++ - 在 C++11 中返回对复数的 real 或 imag 值的引用的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19175776/