Можно ли передать функции-члены std::deque в качестве параметра?

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


person hyperonet    schedule 12.05.2019    source источник
comment
Добро пожаловать в СО! Найдите указатель функции С++ для ответов на ваш вопрос, например stackoverflow.com/questions/1952175/   -  person Dave S    schedule 12.05.2019
comment
@kmdreko Нет, вы не можете.   -  person L. F.    schedule 12.05.2019
comment
@ Л.Ф. чтооо? Я не знал, что это отстой, спасибо за ссылку, хотя   -  person kmdreko    schedule 12.05.2019
comment
@JeJo В самом конце ответа есть упоминание о функциях-членах.   -  person L. F.    schedule 12.05.2019


Ответы (2)


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

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

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


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

#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);
person JeJo    schedule 12.05.2019
comment
Вместо имени переменной where более интуитивным было бы использование position, так как оно указывает на начало или конец std::deque. - person User Using; 13.05.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.

person Maxim Egorushkin    schedule 12.05.2019
comment
Повышен для лямбд. Однако не слишком ли неудобно пользователю помнить, какая лямбда-функция массива предназначена для push_back и push_front? - person User Using; 13.05.2019
comment
@UsingCpp Целью массива здесь является сопоставление логического пользовательского ввода с любой из этих функций. Можно использовать другой тип пользовательского ввода и другое отображение. - person Maxim Egorushkin; 13.05.2019