Lambdas являются объектами функции под капотом. Generic lambdas являются объектами функции с шаблоном operator()
s.
template<class...Fs>
struct funcs_t{};
template<class F0, class...Fs>
struct funcs_t<F0, Fs...>: F0, funcs_t<Fs...> {
funcs_t(F0 f0, Fs... fs):
F0(std::move(f0)),
funcs_t<Fs...>(std::move(fs)...)
{}
using F0::operator();
using funcs_t<Fs...>::operator();
};
template<class F>
struct funcs_t<F>:F {
funcs_t(F f):F(std::move(f)){};
using F::operator();
};
template<class...Fs>
funcs_t< std::decay_t<Fs>... > funcs(Fs&&...fs) {
return {std::forward<Fs>(fs)...};
}
auto f_all = funcs(f1, f2)
генерирует объект, который является перегрузка обоих f1
и f2
.
auto g_integral =
[](auto&& func, auto&& param1, auto&&... params)
-> std::enable_if_t< std::is_integral<
std::decay_t<decltype(param1)>
>{}>
{
// ...
};
auto g_not_integral =
[](auto&& func, auto&& param1, auto&&... params)
-> std::enable_if_t< !std::is_integral<
std::decay_t<decltype(param1)>
>{}>
{
// ...
};
auto gL = funcs(g_not_integral, g_integral);
и вызов gL
будет делать SFINAE дружественное разрешение перегрузки на двух лямбды.
Вышеописанное делает некоторые ложные движения, которых можно было бы избежать, в линейном наследовании funcs_t
. В библиотеке промышленного качества я мог бы сделать наследование двоичным, а не линейным (чтобы ограничить глубину экземпляров шаблонов и глубину дерева наследования).
В стороне, есть четыре причины, по которым я знаю, чтобы SFINAE включал лямбды.
Во-первых, с новым std::function
, вы можете перегрузить функцию на несколько разных сигнатур обратного вызова.
Во-вторых, вышеупомянутый трюк.
В-третьих, currying объект функции, где он оценивает, когда он имеет правильное количество и тип аргументов.
Forth, автоматический набор кортежей и аналогичный. Если я использую стиль продолжения прохождения, я могу запросить переданный в продолжение, если он примет пакет без распаковки или будущий разукрупненный и т. Д.
Ваша лямбда кажется [отлично работает] (http: // ideone. com/rFOkmA) как написано? –
@KerrekSB ОК, это потрясающе, следует ли перефразировать вопрос, чтобы сосредоточиться на бит SFINAE? –
Я понятия не имею, какую проблему вам нужно решить ... –