gpt4 book ai didi

c++ - 从重载函数 std::real 解析地址

转载 作者:可可西里 更新时间:2023-11-01 18:28:28 25 4
gpt4 key购买 nike

std::vector<std::complex<float> > c;
std::vector<float> d;
std::transform(c.begin(), c.end(), d.begin(), std::real<float>);

为什么编译器无法解析来自重载函数的地址 real<float>

编译器指的是哪些重载函数?

最佳答案

您的库实现为 std::real<float> 提供了额外的重载.

为什么会重载?

26.4.9 Additional overloads [cmplx.over]

  • 1 The following function templates shall have additional overloads:

    arg norm
    conj proj
    imag real
  • 2 The additional overloads shall be sufficient to ensure:
    1. If the argument has type long double, then it is effectively cast to complex<long double>.
    2. Otherwise, if the argument has type double or an integer type, then it is effectively cast to complex<double>.
    3. Otherwise, if the argument has type float, then it is effectively cast to complex<float>.

[...]

问题解决方案:

您可以只使用基于...的范围

for (auto v : c) d.push_back(real(v));

... 或将调用打包到 real进入仿函数或另一个函数......

struct my_caller {
template <typename T> T operator() (std::complex<T> const &c) {
return real(c);
}
};

...或者使用成员函数...

std::transform(c.begin(), c.end(), d.begin(), [](std::complex<T> const &c) { 
return c.real();
});

重要提示:

请注意,使用transform 时,目标中必须有足够的空间。 :

std::vector<float> d (c.size());

或使用后插入器:

std::transform(c.begin(), c.end(), back_inserter(d), ...);

否则您将迭代未定义的内存,产生未定义的行为。

关于c++ - 从重载函数 std::real<float> 解析地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15780011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com