Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

typedef vector of functions as a function parameter

I have to write a function that receives std::vector<int> as the first argument, and a vector of functions that will be applied over each element in the vector. If the element does not meet the criteria of all predicate functions, in that case I have to replace that element with the default third argument that the function receives, which has a value of -1. If any predicate function returns false, that element should be replaced with the default argument.

This is what I’ve written so far:

#include <iostream>
#include <vector>
#include <functional>

typedef std::vector<std::function<bool(int)>> Functions;

void default_if_not_all(std::vector<int>& i, Functions f,int def=-1){
  for(auto& num : i){
    for(auto& fun : f){
      if(!(fun(num))){
        num=def;
      }
    }
  }
}

int main(){

  std::vector<int> v{1,2,3,4,5};

  Functions f{
    [&](int a){if( a>0 )return 1;},
    [&](int a){if (a%2==0) return 1;}
  };

  for(const auto& e : v){
    std::cout<<e<<" ";
  }

  std::cout<<std::endl;
}

The problem is that I am not sure how to call the functions from the vector of functions in the right way so that I can change the value of the elements in the int vector.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Does anyone have some advice how to use typedef Functions properly in this case? Am I on the right track?

>Solution :

Your lambda functions only return a value in the true case. You need to return false too.

You don’t need if for that. Just return the result of the comparison:

// note: the lambda capture isn't really needed since it's not used
Functions f{[&](int a) { return a > 0; },
            [&](int a) { return a % 2 == 0; }};

You also need to call your default_if_not_all afterwards:

default_if_not_all(v, f);

Demo

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading