Как я могу создать функцию, которая принимает другую функцию в качестве параметра с неизвестным количеством аргументов? - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю onClick функцию.Предполагается, что при нажатии кнопки она будет вызывать такую ​​функцию:

// This connects the callback to the button class method named "something"
something.onClick(&callback, "a string", 123);

// This is called when the button is clicked
callback("a string", 123);

Я уже использую указатель функции для вызова функции callback, однако я не знаю, какпринять переменное количество аргументов.API, который я хочу, в точности соответствует указанному выше: первый параметр - это функция, а каждый последующий параметр - передаваемый аргумент.До сих пор я думал об использовании boost :: bind, но не могу понять, как это согласуется с тем, что я пытаюсь сделать.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

class Something
{
public:
    template <typename Func, typename ... Args
    void onClick(Func&& func, Args&& ... args)
    {
        m_onClick = [=]{ func(args...); };
    }
private:
    std::function<void()> m_onClick;
    // call m_onClick somewhere
};

int main () {
    Something something;
    something.onClick(&callback, "a string", 123);
}
0 голосов
/ 21 февраля 2019

Как бы вы вызвали функцию, если не знаете, сколько у нее параметров?Есть решения для этого, но почему бы не сделать это простым ...

Допустим, вы хотите использовать любой из двух в качестве обратного вызова:

void foo(std::string x) {}
void bar(int x) {}

Затем вы можете обернуть их вместес параметрами в лямбда-выражениях и сохраните их в std::function, например:

#include <string>
#include <functional>

void foo(std::string x) {}
void bar(int x) {}

struct caller {
    std::function<void()> callback;
    void call() { callback(); }
};

int main(){
    caller c{ [](){ foo("test"); }};
    c.call();
    caller d{ [](){ bar(1); }};
    d.call();
}

Если передаваемые параметры должны быть более динамичными, вам, конечно, нужно что-то большее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...