Home > Back-end >  Passing two parameters at c lambda expression
Passing two parameters at c lambda expression

Time:03-18

I wanted to get a subset of vector having the same keyword in the vector. The code below works well, if I give the fixed keyword.

auto category_matched = [](Product &p) {
    std::string str_return;
    p.GetInfo(kINFO_CATEGORY, str_return);
    return str_return == "keyword"; 
};

std::copy_if(list_.begin(), list_.end(), 
             std::back_inserter(products), 
             category_matched);

Then I tried replacing "keyword" with string variable, which resulted in error.

auto category_matched = [](Product &p, std::string keyword) {
    std::string str_return;
    p.GetInfo(kINFO_CATEGORY, str_return);
    return str_return == keyword; 
};

std::copy_if(list_.begin(), list_.end(), 
             std::back_inserter(products), 
             category_matched);

Some of the error messages are like this:

error: no matching function for call to object of type '(lambda at /Users/src/productset.cpp:128:29)'
        if (__pred(*__first))

note: candidate function not viable: requires 2 arguments, but 1 was provided

How can I add string variable to the function?

CodePudding user response:

capture the keyword

std::string keyword = "froodle";
auto category_matched = [&keyword](Product &p) {
    std::string str_return;
    p.GetInfo(kINFO_CATEGORY, str_return);
    return str_return == keyword; 
};

CodePudding user response:

std::copy_if expects a UnaryPredicate. That is to say, it expects a function that takes one argument.

You are supplying a lambda that takes two arguments. That is the source of the error.

  •  Tags:  
  • c
  • Related