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

Я пытаюсь передать функцию (f1) через другую функцию (f2), но не нужно указывать f1.

Пример кода

Class C {
    private: std::deque<T*> queue;
    public: edit_queue(std::function<void(T*)> f1, void* input);
};

C::edit_queue(...){
    queue.f1(input);
}

Однако это не компилируется с ошибкой:

no member named 'f1' in 'std::__1::deque<T *, std::__1::allocator<T *> >

Я хотел бы иметь возможность сделать и:

edit_queue(push_back, T* input);     (1)

и

edit_queue(push_front, T* input);    (2)

I 'мы также пытались передать указатель на функцию:

public: edit_queue(void (*f1)(T*), T* input);
c::edit_queue(...){queue.f1(input);};

и

private: std::deque<T*>* queue;
...

, но получили тот же результат.

Кроме того, возможно ли не иметьуказать входы f1, а?Например, (1) и (2) будут работать так же, как:

edit_queue(pop_back);

1 Ответ

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

f1 не является методом queue, поэтому ваш код не будет компилироваться.Вы можете по-разному обрабатывать edit_queue, передавая вместо этого лямбду и вызывая ее:

template <typename Container, typename T>
void edit_queue(std::function<void(Container&, const T&)> func, const T& data)
{
  func(queue, data);
}

Затем вызывайте лямбду, которая вызывает push_back или push_front.

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