Краткая версия проблемы имеет перегруженное имя f
, как кратко написать объект ff
такой, что ff(a0, a1, a2, ...)
в конечном счете вызывает f(a0, a1, a2, ...)
.
полиморфный функтор, как выукажи себе, это обычное решение.Но он должен быть определен вне строки (так как в нем есть член шаблона), поэтому я расскажу, что это не достаточно кратко для целей моего ответа.
В настоящее время лямбда-выражения дают мономорфный функтор, поэтому они 'близко, но не совсем.
// set of functions overloaded on int and double
void f(int);
void f(double);
auto ff = [](int i) { return f(i); };
Как указал GMan в комментариях, полиморфные лямбды были бы (должны?) решением для краткой записи полиморфных функторов в строке.
Между тем,можно написать помощник make_overload
, который объединит несколько функторов в один, так что
auto ff = make_overload(
[](int arg0) { return f(arg0); }
, [](double arg0) { return f(arg0); } );
будет «захватывать» весь набор перегрузок.Возможно, здесь может помочь макрос Boost.Preprocessor, так что auto ff = POLYMORPHIC_LAMBDA( 1, (int)(double), { return f(arg0); } );
будет использоваться встроенным.Однако я подозреваю, что существуют ограничения арности (отсюда и первый аргумент макроса), в отличие от обычного внепланового решения, написанного от руки полиморфным функтором;так что это не поможет, например, с помощью шаблонов переменных функций.