提问人:user542101 提问时间:9/20/2021 更新时间:9/20/2021 访问量:472
如何在不“使用命名空间 std::complex_literals”的情况下访问虚单位?
How do you access the imaginary unit without "using namespace std::complex_literals"?
问:
我目前正在处理复数。我需要一些东西来代表虚数单位。一种方法是定义一个变量
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)
如何在不定义自己的 or 的情况下访问常量?i
i
using namespace
答:
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);
double
1.L
0赞
Ted Lyngmo
9/20/2021
@user542101 我认为你做不到。它需要一个 or .不过,它会创建一个。long double
unsigned long long
std::complex<double>
评论
i
using std::complex_literals::operator""i;
3.0i
std::complex_literals
是一个非常小的命名空间。这完全不像.郑重声明,用户代码甚至无法定义此运算符文本,因此这不会与任何用户代码发生冲突。using namespace anything_else;
i
operator""i