Где будут храниться лямбды при испоьзовании 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 шт):
В классе-потомке хранятся его родители. Заметьте, вы наследуетесь от лямбд.
А можно к ним доступ получить тогда?
Можно. Сначала нужно узнать тип желаемой лямбды. Если передавать лямбду не напрямую в Overloader, а сначала положить в переменную, то на ней можно сделать decltype.
Если оставить передачу напрямую в Overloader, то тип придется выковыривать из его параметров шаблона (задачка на частичную специализацию).
Когда тип выяснен, скастовать ваш Overloader к ссылке на нужного родителя-лямбду.