c++ - 存储一个函数c++,稍后调用

标签 c++ algorithm oop design-patterns optimization

我正在开发一个应用程序,其中有很多小算法,每个算法都由几行代码表示,所以我想将那几行代码存储为函数,但不仅如此,我必须存储每个算法都有的一些数据,所以我决定制作一个“算法”类,在其中,我将在“变量”中存储函数。所以,我可以稍后使用它。

我不知道这是否可行,或者是否有其他方法可以实现。 我认为我的“算法”所在的类的局部变量或私有(private)成员会有问题。

class Patterns {

private:
    double line;
    double addPoint(char n) {line += n;}

public:
    double addPattern(int m) {
        double tmp = 0;
        char param;
        // some calculations with m

        // many calls to addPoint, "algorithm"
        tmp += addPoint(param); // param1
        tmp += addPoint(param); // param2
        tmp += addPoint(param); // param3
        tmp += addPoint(param); // param4

        return tmp;
    }
}

只是一个小示例,我想将所有这些行的“addPoints()”存储在一个函数中,并在需要时使用,就像这样

class Patterns {

private:
    double line;
    double addPoint(char n) {line += n;}

public:
    double addPattern(int m) {
        double tmp = 0;
        // some calculations with m

        /**
         * vector of Algorithm class, get any Algorithm, and of that,
         * return the stored function, so I can use it as in the above sample
         */
        auto fn = vec->back()->getFunction();
        tmp += fn(m)

        return tmp;
    }
}

编辑:这个问题包括图书馆的使用<functional>

最佳答案

这听起来怎么样:

#include <vector>
#include <functional>

int test(int a)
{
    return a*2;
}
int main()
{
    using namespace  std;
    vector < function<int(int)>> fv;

    fv.push_back([](int a) {return a + 5; });

    (fv.back())(10);

    fv.push_back(test);

    (fv.back())(240);
}

对于您的类(class),您需要更改函数 的模板参数的类型。

编辑(最小的 class 示例):

class Pattern
{
    double addPoint(char n)
    {
        return n * 99.0;
    }
    double addPoint2(char n)
    {
        return n * 188.25;    
    }

    vector < function<double(char)>> funcs;
public:
    Pattern()
    {
        funcs.push_back(std::bind(&Pattern::addPoint, this, placeholders::_1));         
        funcs.push_back(std::bind(&Pattern::addPoint2, this, placeholders::_1));
    }

    void Call()
    {
        cout << (funcs.back())('A');
    }
};
int main()
{
    Pattern p;
    p.Call();
}

但是,如果函数是全局的或静态的,则不需要执行bind 操作。

关于c++ - 存储一个函数c++,稍后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37717544/

相关文章:

c++ - 如何在 else-if 语句中正确使用 or 语句 (||)

c++ - 我可以通常/总是使用 std::forward 而不是 std::move 吗?

c++ - 函数模板参数包的问题

java - 在 arraylist 中查找字符串的松散匹配

c - 打印给定元素排列的程序

JavaScript - 如何将不同文件中的函数添加到类中?

javascript - 无法访问构造函数中的变量集

c++ - 用于列出子目录中所有文件的递归函数

algorithm - 通过图像识别解决迷宫

Java:迭代器