[英]resolve address from overloaded function std::real<float>
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附加重载[cmplx.over]
1以下功能模板应具有其他重载:
arg norm conj proj imag real
- 2额外的过载应足以确保:
- 如果参数的类型为
long double
,则它有效地转换为complex<long double>
。- 否则,如果参数具有
double
类型或整数类型,则它有效地转换为complex<double>
。- 否则,如果参数的类型为
float
,则它有效地转换为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), ...);
否则,您将迭代未定义的内存,从而产生未定义的行为。
§26.4.9规定,对于float,double和long double类型的参数, real
应具有额外的重载。 看来你的libraray实现为这些重载做了一个模板,也许就像
template <typename T>
T real(T const& t)
{
return std::real(std::complex<T>{t});
}
除了phresnel priovided解决方案之外,您还可以明确地告诉编译器您指的是哪种函数指针:
std::transform(c.begin(), c.end(), d.begin(), (float(*)(std::complex<float> const&))std::real<float>);
然后编译器查找std::real
,它可以转换为给定类型的函数指针,并找到正确的指针。
我告诉你这只是为了完整性 - 我认为这显然是非常丑陋的,并且更喜欢基于lambda的范围或变换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.