【问题标题】:How do you access the imaginary unit without "using namespace std::complex_literals"?如何在没有“使用命名空间 std::complex_literals”的情况下访问虚数单位?
【发布时间】: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) 

如何在不定义自己的iusing 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


【解决方案1】:

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

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

... 但如果您不使用文字命名空间,std::complex&lt;double&gt; 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 字面量命名空间。它们的存在是为了简化生活。

【讨论】:

  • 您将如何使用double 而不是1.L 来执行std::literals::complex_literals::operator""i(1.L); 之类的操作?
  • @user542101 我不认为你可以。它需要long doubleunsigned long long。不过,它会从中创建一个std::complex&lt;double&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2019-01-14
  • 2014-10-09
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多