c ++ std :: vector функций, передаваемых в качестве параметра метода класса - PullRequest
0 голосов
/ 11 декабря 2018

(1) Как создать std :: vector функций, чтобы вы могли сделать что-то вроде этого:

int main ()
{
    std::vector<????> vector_of_functions;
    // Add an adding function into the vector
    vector_of_functions.push_back(
        double function (double a, double b) {
            return a + b
        }
    );
    // Add a multiplying function into the vector
    vector_of_functions.push_back(
        double function (double a, double b) {
            return a * b;
        }
    );

    //  Use the functions
    std::cout << "5 + 7 = " << vector_of_functions[0](5, 7); // >>> 5 + 7 = 12
    std::cout << "5 * 7 = " << vector_of_functions[1](5, 7); // >>> 5 * 7 = 35

    return 0;
}

Хотя я хотел бы, чтобы функция возврата и параметры могли быть любого типа,это не должно быть.Я в порядке, если они являются типом набора.

(2) Как передать этот тип std :: vector в качестве параметра функции.

void func (std::vector<???> vof) {
    std::cout << vof[0](5, 7);
};
int main ()
{
    std::vector<????> vector_of_functions;
    // Add an adding function into the vector
    vector_of_functions.push_back(
        double function (double a, double b) {
            return a + b
        }
    );
    // Add a multiplying function into the vector
    vector_of_functions.push_back(
        double function (double a, double b) {
            return a * b;
        }
    );

    //  Call the function
    func( vector_of_functions ); // >>> 12

    return 0;
}

(3) Как мне сделать то же самое, кроме случаев, когда функция является методом класса, определенного в заголовочном файле.Код .cpp будет таким же, как и раньше, за исключением того, что функция будет void ClassName::func(...); .h. Код будет примерно таким:

class ClassName {
    public:
        ClassName();
        void func(????);
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если вы можете использовать C ++ 11 +, то вы можете использовать std :: function и std :: bind или lambda .

Итак, что-то вроде:

using func = std::function<double(double, double)>;
using vfuncs = std::vector<func>;

vfuncs vf;
vf.push_back([](double first, double second) { return first + second; });
vf.push_back([](double first, double second) { return first * second; });
/* obj is some function, which member function you want to call */
vf.push_back([&obj](double first, double second) { return obj.op(first, second); });
0 голосов
/ 11 декабря 2018

Используйте std::function<double(double,double)> в качестве параметра шаблона для вашего вектора, а затем используйте std::function<double(double,double)> объекты или что-то, что можно преобразовать в std::function<double(double,double)>, например, lamda: например [](double a, double b) -> double { return a + b; }.

...