我试图将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/