我试图将lambda作为参数传递给一个函数,该函数指定是否应将项包括在新向量中。

目前,我正在使用矢量类型(T)和lambda表达式(Func)的模板。但是,如何使该函数接受以T为参数且bool为返回类型的lambda?

这是我的实际代码:

#include <string>
#include <vector>

using namespace std;

// DTO with some members
struct DTO
{
    int Id;
    string Name;
    string Note;
};

// Function to receive a new vector, containing the searched items
template<typename T, typename Func>
vector<T> Where(vector<T> input, Func lambda)
{
    vector<T> v;
    for (auto it = input.begin(); it != input.end(); ++it)
        if (lambda(*it))
            v.push_back(*it);
    return v;
}

int main()
{
// Some test data
    DTO dto1;
    dto1.Id = 1;
    dto1.Name = "Test";
    dto1.Note = "asdasfa";
    DTO dto2;
    dto2.Id = 2;
    dto2.Name = "Test";
    dto2.Note = "asdasfa";
    DTO dto3;
    dto3.Id = 2;
    dto3.Name = "Test2";
    dto3.Note = "asdasfa";
    DTO dto4;
    dto4.Id = 2;
    dto4.Name = "Test2";
    dto4.Note = "asdasfa";
    DTO dto5;
    dto5.Id = 2;
    dto5.Name = "Test2";
    dto5.Note = "123";

    vector<DTO> numbers2 =
    {
        dto1,dto2,dto3,dto4,dto5
    };
// Get new vector with items where Name is Test and Note is asdasfa
    auto test = Where(numbers2, [](DTO dto)
    {
        return dto.Name == "Test" &&
            dto.Note == "asdasfa";
    });
}


目的是使函数调用者感到最舒适。

最佳答案

通常,我们试图避免使模板必须具有一定的签名。

我们更喜欢:


文件要求,以及
在某些不正确的地方依靠编译器错误。


实际上,您的功能模板看起来不错,使用情况也不错,这就是一切正常的原因。

当然,您可以传递不返回bool的内容,而无论在if语句中是否起作用。而且您可以传递不带-DTO但仍然可以工作的东西……但是那又如何呢?只是不要做那些事。如果它走路像鸭子一样…

使用某些机制,可以确保可调用对象采用特定的参数并返回特定类型的值,但这可能很复杂并且坦率地说没有用。

简而言之,您的代码很好。

关于c++ - 如何使用lambda作为参数返回 bool 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56283829/

10-11 22:45
查看更多