gpt4 book ai didi

c++ - 更改复数输出格式

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:48 27 4
gpt4 key购买 nike

complex<> C++ 标准库中的模板,它有一个重载的 << 运算符,因此它以 (real_part, im_part) 格式输出复数。我需要更改该运算符对复数的行为,以便将输出格式更改为完全不同的格式。具体来说,我需要输出的形式为 real_part\tim_part .我该怎么做?

最佳答案

没有直接的方法来替换 operator << ,但您确实有几个选择。首先,您可以编写自己的函数来打印复数:

template <typename T> void PrintComplex(const complex<T>& c) {
/* ... */
}

如果你仍然想使用漂亮的流语法,那么你可以做的一个技巧是制作一个包装器类来包装 complex然后定义自己的operator <<以不同的方式打印出来。例如:

template <typename T> class ComplexPrinter {
public:
/* Conversion constructor allows for implicit conversions from
* complex<T> to ComplexPrinter<T>.
*/
ComplexPrinter(const complex<T>& value) : c(value) {
// Handled in initializer list
}

/* Output the complex in your own format. */
friend ostream& operator<< (ostream& out, const ComplexPrinter& cp) {
/* ... print in your own format ... */
}

private:
complex<T> c;
};

一旦你有了这个,你就可以写这样的东西了

cout << ComplexPrinter<double>(myComplex) << endl;

您可以通过编写一个像这样的函数来为您包装对象,从而使它更加清晰:

template <typename T>
ComplexPrinter<T> wrap(const complex<T>& c) {
return ComplexPrinter<T>(c);
}

这让你可以写

cout << wrap(myComplex) << endl;

虽然不完美,但已经很不错了。

关于上面的包装器需要注意的一件事是它有一个隐式转换构造函数设置让你转换 complex<T> s 至 ComplexPrinter<T>秒。这意味着如果你有一个 vector< complex<T> > ,您可以通过调用使用您的自定义代码将其打印出来

vector< complex<double> > v = /* ... */
copy (v.begin(), v.end(), ostream_iterator< ComplexPrinter<double> >(cout, " "));

在输出时,隐式转换构造函数将转换您的 complex<double>将其放入包装器中,您的自定义代码将为您进行打印。

如果你想大胆一点,把谨慎抛之脑后,你甚至可以编写这个类,让它只存储对原始 complex 的引用。 ,如下所示:

template <typename T> class ComplexPrinter {
public:
/* Conversion constructor allows for implicit conversions from
* complex<T> to ComplexPrinter<T>.
*/
ComplexPrinter(const complex<T>& value) : c(value) {
// Handled in initializer list
}

/* Output the complex in your own format. */
friend ostream& operator<< (ostream& out, const ComplexPrinter& cp) {
/* ... print in your own format ... */
}

private:
const complex<T>& c;
};

这完全消除了任何复制,只是使包装器成为真实 complex 周围的一层薄薄的饰面。 . (没有双关语意)。如果您这样做时必须非常小心,不要将这些对象传递到原始对象超出范围的范围边界,但如果这是您想要的,它可能会很好。

希望这对您有所帮助!

关于c++ - 更改复数输出格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com