我正在寻找一个函数,该函数返回对 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/

10-12 15:06