gpt4 book ai didi

c++ - 如何使用 isnan 作为 std::find_if 的谓词函数 (c++11)

转载 作者:太空狗 更新时间:2023-10-29 19:43:58 29 4
gpt4 key购买 nike

我有一段代码在 std::vector<double> cats 上运行并且正在做这样的事情:

std::find_if(cats.begin(), cats.end(), std::isnan<double>);

这可以在 4.3 之前的 gcc 下编译,但不再可以在 gcc 4.7.2 下编译。我收到这样的错误:

error: no matching function for call to 'find_if(std::vector<double>::iterator, std::vector<double::iterator, <unresolved overloaded function type>)'

我怎样才能让它在较新的 gcc 下编译?最好也在旧的 gcc 下?当然,无需摆脱 STL 和手动编写循环。如果不可能同时执行这两项操作,那么新的 gcc 就足够了,我会将这两个实现都保留在那里并带有 #define。 .

最佳答案

你真正想要的重载不是 GCC 4.7 中的模板,它只是一个带有这个签名的普通函数:

bool isnan(double);

(有一个模板,但是SFINAE表示它只适用于整数类型。)

但在以前的版本中它是一个模板,因此没有一种简单的可移植方式来获取它的地址。

既然你已经说过 C++11,你可以使用 lambda 并让 lambda 的主体进行重载解析以找到正确的重载(或模板特化):

std::find_if( cats.begin(), cats.end(), [](double d) { return std::isnan(d); } );

否则,对于 C++03,您可以提供自己的转发包装器:

struct IsNan {
double operator()(double d) const { return std::isnan(d); }
};
std::find_if( cats.begin(), cats.end(), IsNan() );

关于c++ - 如何使用 isnan 作为 std::find_if 的谓词函数 (c++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17574242/

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