Можно использовать лямбды:
#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
может использоваться вместо простых указателей функций.