Можно ли передать функции-члены std :: deque в качестве параметра? - PullRequest
3 голосов
/ 12 мая 2019

Я хочу использовать push_front или push_back в зависимости от ввода пользователя.Можно ли включить это в параметр функции, а затем написать одну функцию для экономии памяти?

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Возможно ли включить это в параметр функции?

Нет .Вы не можете.

В этом обсуждении можно найти хорошее объяснение: Можно ли взять адрес функции, определенной в стандартной библиотеке?


ОднакоОбходной путь можно сделать, явно указав функции, где должна происходить вставка.

#include <iostream>
#include <deque>

enum class To{ front = 0, back };

void func(std::deque<int>& dq, const int value, const To where)
{
    if (where == To::front)
    {
        dq.push_front(value);
        // code
    }
    else if(where == To::back)
    {
        dq.push_back(value);
        // code
    }
}

И вы называете это

std::deque<int> dq;
func(dq, 1, To::back);
func(dq, 2, To::front);
1 голос
/ 12 мая 2019

Можно использовать лямбды:

#include <deque>

void f(bool user_input) {
    using C = std::deque<int>;
    using FnType = void(*)(C&, int);
    FnType const fns[2] = {
        [](C& c, int value) { c.push_front(value); },
        [](C& c, int value) { c.push_back(value); }
    };
    C q;
    fns[user_input](q, 1);
    fns[!user_input](q, 2);
}

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

...