【发布时间】:2023-04-03 12:09:02
【问题描述】:
我目前正在处理复数。我需要一些东西来代表虚数单位。一种方法是定义一个变量
std::complex<double> imaginary_unit{0, 1};
但是,我发现有一个内置的虚数单位i。例如,在问题here 中讨论了这个单元。
建议的解决方案如下:
#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 或using namespace 的情况下访问常量i?
【问题讨论】:
-
请注意
i在这里实际上不是一个常数,它是一个 user-defined literal operator。所以你可以使用using std::complex_literals::operator""i;,然后你可以写3.0i。 -
不要把using指令放在污染全局命名空间的地方?这种不考虑上下文的对指导方针的坚持是货物崇拜编程。
-
std::complex_literals是一个非常小的命名空间。这与using namespace anything_else;完全不同。为了记录,用户代码甚至不能定义这个操作符文字,所以这不可能与任何用户代码发生冲突。 -
不小心用
i污染了命名空间,而这是 for 循环中的首选虚拟变量,从长远来看似乎是个坏主意 -
@user542101,这不是它的工作原理,它的名字是
operator""i。
标签: c++ namespaces constants complex-numbers c++-standard-library