如何将isnan用作std::find_if(c++11)的谓词函数
How to use isnan as a predicate function to std::find_if (c++11)
我有一段代码在std::vector<double> cats
上运行,它正在做这样的事情:
std::find_if(cats.begin(), cats.end(), std::isnan<double>);
这是在gcc 4.3之前编译的,但不再使用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++11中,isnan
是针对不同浮点类型float
、double
和long double
的三个重载的集合。您可以使用强制转换语法来解决所需的过载:
std::find_if(cats.begin(), cats.end(),
static_cast<bool (*)(double)>(std::isnan));
当然,如果您的目标平台都支持lambda,那么对于维护人员来说,Jonathan建议的lambda的使用可能会更清楚。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- C++11:模板方法的模板函数调用无法编译?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 在 C++11 函数中使用尾随返回类型的优点
- 当加入 C++11 函数的线程仍未终止时,是否可以返回?
- 如何使用 c++11 函数回调声明多个模板参数
- 通用 C++11 函数包装器,用于基于任务的并行性
- 有没有办法<int><double>在使用 C++11 函数调用期间自动将"向量"提升为"向量"?
- 如何使C++11函数生效<>参数自动接受lambdas
- 如何将可变数量的不同类型的参数传递给 C++11 函数映射中的函数
- 看看c++11函数是如何实现的
- Eclipse Luna 无法解析 c++11 函数"stoi"
- 用可变的std::function的c++ 11函数签名
- 使用NSS调用pkcs#11函数
- 从现代C++11函数转换为原始函数指针
- c++ 11函数返回时会发生什么
- 带有auto关键字的c++ 11函数定义
- __func__ C++11 函数的局部预定义变量,无法编译