gpt4 book ai didi

c++ - 在不知道参数类型的情况下否定 lambda?

转载 作者:太空狗 更新时间:2023-10-29 20:03:14 25 4
gpt4 key购买 nike

我正在尝试编写一个与 Python 过滤器类似的就地过滤器函数。例如:

std::vector<int> x = {1, 2, 3, 4, 5};
filter_ip(x, [](const int& i) { return i >= 3; });
// x is now {3, 4, 5}

首先我尝试了这个:

template <typename Container, typename Filter>
void filter_ip(Container& c, Filter&& f)
{
c.erase(std::remove_if(c.begin(), c.end(), std::not1(f)), c.end());
}

但是,这不起作用,因为 lambdas don't have an argument_type field .

以下变体 does work :

template <typename Container, typename Filter>
void filter_ip(Container& c, Filter&& f)
{
c.erase(std::remove_if(c.begin(), c.end(),
[&f](const typename Container::value_type& x) {
return !f(x);
}),
c.end());
}

然而,它似乎不太理想,因为以前,它只需要 Containerbegin , end , 和 erase , 而现在它还要求它定义一个 value_type .而且它看起来有点笨重。

这是 this answer 中的第二种方法.第一个将使用 std::not1(std::function<bool(const typename Container::value_type&)>(f))而不是 lambda,它仍然需要类型。

我还尝试将 arg func 指定为 std::function具有已知参数类型:

template <typename Container, typename Arg>
void filter_ip(Container& c, std::function<bool(const Arg&)>&& f)
{
c.erase(std::remove_if(c.begin(), c.end(), std::not1(f)), c.end());
}

但后来我得到:

'main()::<lambda(const int&)>' is not derived from 'std::function<bool(const Arg&)>'

有什么办法解决这个问题吗?直觉上它似乎应该非常简单,因为您需要做的就是将 not 应用于您已经知道的 bool f返回。

最佳答案

如果您不能使用 C++14 通用 lambda,如何使用模板化 operator() 委托(delegate)给经典仿函数:

#include <utility>
#include <vector>
#include <algorithm>
#include <iostream>

template <class F>
struct negate {
negate(F&& f)
: _f(std::forward<F>(f)) {}

template <class... Args>
bool operator () (Args &&... args) {
return !_f(std::forward<Args>(args)...);
}

private:
F _f;
};

template <typename Container, typename Filter>
void filter_ip(Container& c, Filter&& f)
{
c.erase(std::remove_if(
c.begin(),
c.end(),
negate<Filter>(std::forward<Filter>(f))),
c.end()
);
}

int main() {
std::vector<int> v {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
filter_ip(v, [](int i) {return bool(i%2);});
for(auto &&i : v)
std::cout << i << ' ';
std::cout << '\n';
}

输出:

1 3 5 7 9 

Live on Coliru

关于c++ - 在不知道参数类型的情况下否定 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599821/

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