我正在寻找一个函数,该函数返回对 C++11 中复数的实数或图像值的引用。在 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);
那是不干净的。
还有其他[干净]的方法可以做到这一点吗?
如果您确实想将复数的实部和虚部的输入分开,您可以尝试 IO 操纵器方法。
#include <complex>
#include <iosfwd>
class proxy_complex {
explicit proxy_complex(std::istream& strm, bool f)
: strm_(&strm), flag(f) { }
proxy_complex(const proxy_complex&) = default;
std::istream* strm_;
bool flag; // flag to check whether we're writing real or imag
public:
template<typename T>
std::istream& operator>>(std::complex<T>& c)
{
T n;
if (*strm_ >> n)
flag ? c.real(n) : c.imag(n);
return *strm_;
}
friend proxy_complex operator>>(std::istream& is, proxy_complex(*func)(std::istream&))
{
return func(is);
}
friend proxy_complex real(std::istream&);
friend proxy_complex imag(std::istream&);
};
inline proxy_complex real(std::istream& is)
{
return proxy_complex(is, true);
}
inline proxy_complex imag(std::istream& is)
{
return proxy_complex(is, false);
}
您可以将上述代码放入其自己的头文件中(如果这样做,将其包装在命名空间中可能是个好主意)。
Usage:
#include <iostream>
#include "my_header.h"
int main()
{
std::complex<double> c;
std::cin >> real >> c >> imag >> c;
if (std::cin) std::cout << c;
}
希望我正确地猜到了你对“干净”的定义:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)