Можете ли вы сделать вектор функций с параметрами? - PullRequest
2 голосов
/ 08 октября 2019

Можно ли создать вектор, в котором функции возвращены назад?
Я пытался что-то сделать с указателями, но он работает только с функциями без параметров.

Например,

#include <iostream>
#include <vector>

using namespace std;

void printInt();

int main()
{
    vector<void (*)()> functionStack;

    functionStack.push_back(printInt);

    (*functionStack[0])();
}

void printInt()
{
    cout << "function works!" << 123 << endl;
}

Это работает, но не то, что мне нужно.
Правильная версия - это функция с параметрами: void printInt(int a), и вы можете вызывать ее с другими значениями, такими как 4 или -1, ноиз вектора functionStack.

Вероятно, сложнее, если функции в векторе имеют разные параметры, поэтому давайте предположим, что каждая функция имеет одинаковый тип и количество параметров.

Ответы [ 2 ]

5 голосов
/ 08 октября 2019

This:

void (*)()

- указатель на функцию, принимающий no аргументов. Поэтому измените его, чтобы принять желаемый аргумент.

void (*)(int)

Примерно так:

void printInt(int x)
{
    cout << "function works!" << x << endl;
}

int main()
{
    vector<void (*)(int)> functionStack;

    functionStack.push_back(printInt);

    (*functionStack[0])(123);
}

Вы правы, говоря, что функции должны иметь одинаковый тип и количество параметров, чтобы это было допустимо.

2 голосов
/ 08 октября 2019

У вас это уже было.

#include <iostream>
#include <vector>

using namespace std;

void printInt(int a);

int main()
{
    // Just needed the parameter type
    vector<void (*)(int)> functionStack;

    // Note that I removed the () from after the function
    // This is how we get the function pointer; the () attempts to
    // invoke the function
    functionStack.push_back(printInt);

    (*functionStack[0])(42);
}

void printInt(int a)
{
    cout << "function works! " << a << endl;
}

Это также ситуация, когда std::function также может быть полезным.

#include <iostream>
#include <functional>
#include <vector>

using namespace std;

void printInt(int a);

int main()
{
    // Similar syntax, std::function allows more flexibility at a 
    // lines of assembly generated cost. But it's an up-front cost
    vector<std::function<void(int)>> functionStack;

    functionStack.push_back(printInt);

    // I don't have to de-reference a pointer anymore
    functionStack[0](42);
}

void printInt(int a)
{
    cout << "function works! " << a << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...