Unique_pseudofunction — N overloads for the price of one

EN / День 2 / 17:15 / Зал 3

This talk will present a class template that behaves almost like any_invocable, but lacks one of its key restrictions: having just one overload of operator(). std::function is an excellent tool for interface design. It encapsulates almost any object that is invocable the right way. any_invocable is an even better tool. It can encapsulate some types that std::function can't — the ones that are move-only. Unfortunately, it is still invocable in just one way. You get one list of argument types and that's what you must pass.

What if the object you want to pass is invocable in more than one way? What if it's operator() is a template that you will instantiate with N different types? What if it is a variadic template to which you will pass 0-N arguments? What if you use tag dispatch to do N different things? If you want these things, as well as the type erasure offered by std::function and the move-only support offered by any_invocable, then unique_pseudofunction is the class for you.

Follow the path Filipp took towards realizing that unique_pseudofunction is the solution to most problems. We'll break this down into the following steps:

  • building a simple non-generic any_invocable;
  • making it generic;
  • adding a small buffer optimization;
  • extending it to support more than one overload of operator().

We will also look in close detail at several problems solved along the way, and several others that are still unsolved. This talk involves small amounts of C++17 and large amounts of template metaprogramming, function references, and type erasure.


Почему этот доклад в программе

Чем хорош спикер: Автор unique_pseudofunction, соответственно он глубоко понимает тему и, что немаловажно, умеет про нее рассказывать.

Чем хороша тема: Это достаточно узкая, но очень прикладная тема. Всегда интересно посмотреть как люди решают задачи, особенно, если они делают это нестандартно.

Кому будет полезно: Для тех, кому хочется посмотреть на новые подходы в программировании, кому кажется, что std::function слишком ограничен в возможностях, а ООП-подход слишком тяжеловесен, старомоден и неуклюж. Также будет интересен тем кому интересна шаблонная магия и нюансы реализации подобных обобщенных вещей.

Почему здесь и сейчас: Начиная с С++11 у нас есть std::function, но std::function имеет важное ограничение - он не может при захвате значения использовать move-семантику. Есть any_invocable (proposal P0288R4), который снимает это ограничение и позволяют использовать move-семантику для захватываемых сущностей. Автор в данном докладе представит обобщение и расширение std::function и any_invocable -- unique_pseudofunction. Она не имеет ограничений как std::function и, при этом предоставляет возможности перегрузки - в зависимости от типов аргументов будет вызвана та, или иная реализация. Возможно даже шаблонная. Это еще сильнее стирает грань между классами и функциями в С++, позволяет посмотреть на организацию кода и архитектуры под совершенно другим, не привычным, углом.