C++中是否存在条件运算符的预定义仿函数?为何未提供?
C++标准库为何没有条件运算符的预定义仿函数?
C++标准库中的预定义仿函数是各类运算符的包装器,常被用于STL算法场景,但你会发现,唯独条件运算符(?:)没有对应的标准仿函数。这背后主要有几个原因:
参数类型规则过于复杂:条件运算符的三个操作数有特殊的类型要求——第一个必须是布尔型,后两个操作数需要能转换为同一个公共类型。这种类型推导逻辑和其他运算符的仿函数(比如
std::greater、std::plus)的简单模板参数匹配差异极大,很难用标准仿函数的统一模板模式去适配。无法模拟短路求值语义:原生的
?:是短路求值的:当第一个表达式为真时,只会计算第二个表达式,第三个表达式会被跳过;反之则只计算第三个。但仿函数调用时,所有参数都会在调用前被完整求值,这就完全丢失了?:的短路特性,没法做到和原生运算符一致的行为。实用性不足:绝大多数场景下,用lambda表达式就能快速实现等价逻辑,写法简洁直观(比如示例中的
[](int i, int j){ return i > j ? i : j; })。就算需要复用,自己实现一个条件仿函数也非常简单,没必要纳入标准库。
示例代码
#include <algorithm> #include <iostream> #include <vector> #include <ctime> int main() { std::vector<int> v1(10), v2(10), v3(10); srand(static_cast<unsigned>(time(nullptr))); // 生成两个随机值向量 generate(v1.begin(), v1.end(), []{return rand()%100;}); generate(v2.begin(), v2.end(), []{return rand()%100;}); // 选取对应位置的较大元素 transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), [](int i, int j){ if (i>j) return i; else return j;}); // 假设存在条件仿函数的等价代码(仅作演示) // transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), // conditional<>(greater<>())); // 输出选取的结果 for(auto e: v3) std::cout << e << ", "; std::cout << std::endl; }
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

