有没有办法有条件地将函子作为谓词传递给标准库算法?

问题描述 投票:0回答:1

我有一个对

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
检查,但我仍然想重用内置比较,而不是希望编译器会这样做内联我的,它将始终按预期工作。

c++ std
1个回答
0
投票

将通用类型传递给算法调用,例如:

 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();

演示

© www.soinside.com 2019 - 2024. All rights reserved.