2

我目前正在处理复数。我需要一些东西来代表虚数单位。一种方法是定义一个变量

std::complex<double> imaginary_unit{0, 1};

但是,我发现有一个内置的虚数单位i。例如,在此处的问题中讨论了该单元。

建议的解决方案如下:

#include <complex>
using namespace std::complex_literals;

然后使用如下常量i

std::complex<double> z1 = 1i * 1i;

我被教导这using namespace是不好的风格,并且会给使用我的标题的人带来问题。我试图以详细的方式访问这个内置常量i,但到目前为止我还没有成功。下面是两个失败的例子:

// error: namespace std::literals::complex_literals has no member i
std::literals::complex_literals::i
// error: more than one instance of overloaded function
std::literals::complex_literals::operator""i(3.0) 

如何在i不定义自己的i或的情况下访问常量using namespace

4

1 回答 1

2

您可以像这样创建单位常量:

constexpr auto imaginary_unit = std::literals::complex_literals::operator""i(1.L);

...但如果您不使用文字名称空间,则更std::complex<double> imaginary_unit{0, 1};可取。它更短,更容易阅读。

... 常数i...

i不是一个常数。这是一个用户定义的文字。一种可能的实现:

constexpr std::complex<double> operator""i(long double d) {
    return std::complex<double>{0.0, static_cast<double>(d)};
}

我认为您不应该害怕using文字名称空间。他们在那里简化生活。

于 2021-09-19T18:44:31.790 回答