Could some one help me how to implement this code?
I need to pass a function to another function:
std::cout << process_time(Model::method1) <<
The key is that method1 is a function template:
template <typename T> double method1(std::vector<T>& );
As such, it's not a function... it's a family of functions. process_time expects a single function, so you just have to pass it the one function that you want to use:
std::cout << process_time(method1<int>) << std::endl;
This is the closest to your code that compiles:
#include <iostream>
#include <vector>
struct Model {
template <typename T>
double method1(std::vector<T> &v) {
double t = 0;
//...
return t;
}
};
template <typename F>
double process_time(F algorithm) {
Model model;
double time = 0;
bool stop_criteria = false;
do
{
std::vector<int> arg1;
// ...
time += (model.*algorithm)(arg1);
} while (!stop_criteria);
return time;
}
int main() {
std::cout << process_time(&Model::method1<int>) << std::endl;
}
Change your process time line with time += to:
time += algorithm(&model,arg1);
then call it with:
std::cout << process_time([](Model* m, std::vector<int>& v){return m->method1(v);}) << std::endl;
or in C++14:
std::cout << process_time([](Model* m, auto& v){return m->method1(v);}) << std::endl;
which leaves the choice of what kind of vector it will pass to method1 up to process_time instead of fixing it at the calling site.
Basically, this avoids dealing with pointer-to-member variables. Instead, the algorithm in process_time is just a map from Model x vector to double. This also means that we can have a non-member algorithm.
If you don't like the verbosity of the above at the call site, you can keep the changes to process_time and change the call to:
std::cout << process_time(std::ref(&Model::method1<int>)) << std::endl;
as std::ref takes a pointer to a member function, and returns a callable object that takes a pointer-to-Model as the first argument, and std::vector<int>& as the second. Which matches how we use it.