我有一个对
std::mismatch
的调用,其中包含许多参数,并且根据某些条件,我需要运行标准版本或带有我的谓词的版本。
有没有办法避免
std::mismatch
调用重复,以某种方式将此条件放在传递 some_functor
的地方?
这是功能齐全的演示。
这是代码:
#include <algorithm>
#include <iostream>
#include <vector>
struct some_functor {
bool is_5_met = false;
bool operator ()(auto lhs, auto rhs) {
if (is_5_met) {
return false;
}
if (lhs == 5 || rhs == 5) {
is_5_met = true;
}
return lhs == rhs;
}
};
auto some_function(const std::vector<int>& data, long offset, bool cond) {
return cond
? std::mismatch(data.begin(), data.end(), data.begin() + offset, data.end(), some_functor()).first - data.begin()
: std::mismatch(data.begin(), data.end(), data.begin() + offset, data.end()).first - data.begin();
}
int main()
{
std::vector<int> data = { 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, };
std::cout << "Without 5 as sentinel : " << some_function(data, 7, false) << "\n";
std::cout << "With 5 as sentinel : " << some_function(data, 7, true) << "\n";
}
当然,我可以将条件变量传递给函子并在那里进行处理,但这会导致对高频操作的过度检查。
我想要这样的东西:
auto some_function(const std::vector<int>& data, long offset, bool cond) {
return std::mismatch(data.begin(), data.end(), data.begin() + offset, data.end(), cond ? some_functor() : AND-DEFAULT-COMPARISON-HERE).first - data.begin();
}
我也想避免制作多态函子。避免制作“琐碎”函子会很好,这是可能的。
对于后者,我的意思是我可以编写 lambda,它会有条件地返回两个 lambda 之一,即我的和“琐碎”的 lambda,仅使用
lhs == rhs
检查,但我仍然想重用内置比较,而不是希望编译器会这样做内联我的,它将始终按预期工作。
将通用类型传递给算法调用,例如:
using common_t = std::function<bool(int const&, int const&)>;
std::mismatch(
data.begin(), data.end(), data.begin() + offset, data.end(),
cond ? common_t( some_functor{}) : common_t(std::equal_to<int>{})
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
).first - data.begin();