如何在不“使用命名空间 std::complex_literals”的情况下访问虚单位?

How do you access the imaginary unit without "using namespace std::complex_literals"?

提问人:user542101 提问时间:9/20/2021 更新时间:9/20/2021 访问量:472

问:

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

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

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

建议的解决方案如下:

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

然后使用如下所示的常量:i

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

我被教导说这是糟糕的风格,可能会给使用我的标题的人带来问题。我试图以冗长的方式访问这个内置的常量,但到目前为止我还没有成功。下面有两个失败的例子:using namespacei

// 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) 

如何在不定义自己的 or 的情况下访问常量?iiusing namespace

C++ 命名空间 常量 复数 C++-标准库

评论

1赞 Nathan Pierson 9/20/2021
请注意,这里实际上不是一个常量,它是一个用户定义的文字运算符。所以你可以使用,然后你可以写.iusing std::complex_literals::operator""i;3.0i
2赞 StoryTeller - Unslander Monica 9/20/2021
不要把 put using 指令放在污染全局命名空间的地方?这种不考虑上下文而遵守准则的做法是货物崇拜节目。
1赞 chris 9/20/2021
std::complex_literals是一个非常小的命名空间。这完全不像.郑重声明,用户代码甚至无法定义此运算符文本,因此这不会与任何用户代码发生冲突。using namespace anything_else;
1赞 user542101 9/20/2021
从长远来看,当命名空间是 for 循环中的首选虚拟变量时,意外地污染了命名空间似乎是一个坏主意i
4赞 chris 9/20/2021
@user542101,这不是它的工作原理,它的名字是.operator""i

答:

2赞 Ted Lyngmo 9/20/2021 #1

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

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

评论

0赞 user542101 9/20/2021
你会怎么做这样的事情,而不是?std::literals::complex_literals::operator""i(1.L);double1.L
0赞 Ted Lyngmo 9/20/2021
@user542101 我认为你做不到。它需要一个 or .不过,它会创建一个。long doubleunsigned long longstd::complex<double>