Где будут храниться лямбды при испоьзовании using Ts::operator()...?

Вот здесь в документации описывается механизм создания функтора с передачей в его конструктор лямбд. А где лямбды то храниться будут? Неужели где-то в классе через автогенкод? А можно к ним доступ получить тогда? Я имею ввиду не вызов, а указатель или ссылку. У лямбды то неименованный автогентип, получается через квалифиированное имя к T::operator() обратиться не получиться...

template<typename... Ts>
struct Overloader : Ts...
{
    using Ts::operator()...; // exposes operator() from every base
};
 
template<typename... T>
Overloader(T...) -> Overloader<T...>; // C++17 deduction guide, not needed in C++20
 
int main()
{
    auto o = Overloader{ [] (auto const& a) {std::cout << a;},
                         [] (float f) {std::cout << std::setprecision(3) << f;} };
}

Ответы (1 шт):

Автор решения: HolyBlackCat

В классе-потомке хранятся его родители. Заметьте, вы наследуетесь от лямбд.

А можно к ним доступ получить тогда?

Можно. Сначала нужно узнать тип желаемой лямбды. Если передавать лямбду не напрямую в Overloader, а сначала положить в переменную, то на ней можно сделать decltype.

Если оставить передачу напрямую в Overloader, то тип придется выковыривать из его параметров шаблона (задачка на частичную специализацию).

Когда тип выяснен, скастовать ваш Overloader к ссылке на нужного родителя-лямбду.

→ Ссылка