传递模板方法作为参数

时间:2015-04-23 17:21:05

标签: c++ templates c++11 argument-passing

有人可以帮我解决如何实现此代码的问题吗?

我需要将一个函数传递给另一个函数:

std::cout << process_time(Model::method1) << std::endl;

此函数将函数作为模板类型获取并在对象上调用

template <typename F>
double process_time(F algorithm)
{
    Model model;
    double time=0;
    do
    {
        // ...
        time += model.algorithm(arg1);
    } while (! stop_criteria);
    return time;
}

请注意,method1也是一个功能模板:

template <typename T>
double method1(std::vector<T> &v)
{
    ...
}

它的法律语法是什么?

的main.cpp

#include <iostream>
#include <vector>

class Model
{
public:

    template <typename T>
    double method1(std::vector<T> &v)
    {
        double t = 0;
        //...
        return t;
    }

    template <typename T>
    double method2(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) << std::endl;
    return 0;
}

3 个答案:

答案 0 :(得分:2)

关键是method1是一个函数模板

template <typename T> double method1(std::vector<T>& );

因此,它不是 函数......它是一系列函数。 process_time需要一个函数,所以你只需要传递你想要使用的 one 函数:

std::cout << process_time(method1<int>) << std::endl;

答案 1 :(得分:1)

这是最接近编译代码的代码:

#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;
}

答案 2 :(得分:1)

将您的process timetime +=更改为:

   time += algorithm(&model,arg1);

然后用:

来调用它
std::cout << process_time([](Model* m, std::vector<int>& v){return m->method1(v);}) << std::endl;

或在C ++ 14中:

std::cout << process_time([](Model* m, auto& v){return m->method1(v);}) << std::endl;

可以选择将method1传递给process_time的矢量,而不是将其固定在调用网站上。

基本上,这可以避免处理指向成员变量的指针。相反,algorithm中的process_time只是从Model x vectordouble的地图。这也意味着我们可以拥有非成员algorithm

如果您不喜欢呼叫网站上述详细信息,可以将更改保留为process_time并将呼叫更改为:

std::cout << process_time(std::ref(&Model::method1<int>)) << std::endl;

as std::ref获取指向成员函数的指针,并返回一个可调用对象,该对象将指针指向Model作为第一个参数,std::vector<int>&作为第二个参数。这符合我们使用它的方式。