【问题标题】:Function passed as a class argument作为类参数传递的函数
【发布时间】:2016-03-23 17:54:00
【问题描述】:

在 C++ 中,我们可以像这样将函数/函子传递给函数:

template <typename F>
void doOperation(int a, int b, F f){
    std::cout << "Result: " << f(a,b) << std::endl;
}

然后我们可以同时使用函数和仿函数:

int add(const int &a, const int &b){ return a+b; }
struct subtract(){
    void operator() (const int &a, const int &b) { return a-b; }
};

并以下列方式使用它:

doOperation(1,2,add);
doOperation(5,2,subtract());

我的问题是,我可以对一个类做类似的事情并将一个函数作为参数传递给一个类,存储它并稍后使用它?例如

template <typename F>
class doOperation{
    public:
       doOperation(int &a, int &b, F f) : a(a), b(b), f(f) {};
   void setOperands(int &a, int &b) { this->a = a; this->b = b };
   void performCalculation(){
          std::cout << "Result: " << f(a,b) << std::endl;
       }
    private:
        int a,b;
        F f;
}

这样我们就可以给它分配一个函数,然后再使用它:

doOperation summing(1,2,add);
summing.setOperands(2,3);
summing.performCalculation();

doOperation subtraction(7,3,subtract());
subtraction.performCalculation();

如果我的例子是有效的,我会很感激这里对机制的解释,因为我似乎有点迷失了。万一我错过了什么,我正在寻找有关这是否可以实现的提示。

最后,我将如何在其他函数和类中使用这样的class doOperation。例如,在成员函数中定义这样的东西需要我模板化新类、它的成员函数,以及如何声明和使用它:

class higherFunctionality{    
 public:
     higherFunctionality() {...}

     void coolThings(){
        doOperation *myOperation = operationFactory( ... );
        myOperation->setOperands(4,5);
        myOperation->performCalculation();
     }
};

【问题讨论】:

标签: c++ function templates


【解决方案1】:

是的,但是您必须在实例化模板类时提供类型。处理这个问题的常用方法是创建一个辅助函数:

template < typename Fun > struct operation_class 
{  
    operation_class(Fun f) : fun{f} {}
    Fun fun; 
};
template < typename Fun >
operation_class<Fun> operation(Fun fun) { return operation_class<Fun>{fun}; }

int main()
{
    auto op0 = operation(some_fun);
    auto op1 = operation(some_functor{});
}

坦率地说,你最好只使用 lambda:

auto op0 = [a,b]() { return sum(a,b); };
auto op1 = [a,b]() { return subtract{a,b}(); }

// C++17:
auto op2 = [op=subtract{a,b}] { return op(); };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多