Я хочу использовать push_front
или push_back
в зависимости от ввода пользователя. Можно ли включить это в параметр функции, а затем написать одну функцию, чтобы сэкономить память?
Можно ли передать функции-члены std::deque в качестве параметра?
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
Вместо имени переменной
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
Повышен для лямбд. Однако не слишком ли неудобно пользователю помнить, какая лямбда-функция массива предназначена для push_back и push_front?
- person User Using; 13.05.2019
@UsingCpp Целью массива здесь является сопоставление логического пользовательского ввода с любой из этих функций. Можно использовать другой тип пользовательского ввода и другое отображение.
- person Maxim Egorushkin; 13.05.2019