Явный пользовательский оператор преобразования для лямбды

Статья посвященный лямбда-функциям и особенно касается их ClosureType::operator ret(*)(params)(), В этой статье оператор упоминается как «универсальный шаблон захвата лямбда-функции, определяемый пользователем без захвата».

Данный код (автоматическое преобразование в указатель на функцию соответствующего типа):

#include <iostream>
#include <cstdlib>

#if 0

template< typename L, typename R, typename ...A >
constexpr
auto
to_function_pointer(L l, R (L::*)(A...) const)
{
return static_cast< R (*)(A...) >(l);
}

template< typename L, typename R, typename ...A >
constexpr
auto
to_function_pointer(L l, R (L::*)(A...))
{
return static_cast< R (*)(A...) >(l);
}

template< typename L >
constexpr
auto
to_function_pointer(L l)
{
return to_function_pointer(l, &L::operator ());
}

#endif

template< typename R, typename ...A >
constexpr
auto
to_function_pointer(R (* fp)(A...))
{
return fp;
}

namespace
{

void f() { std::cout << __PRETTY_FUNCTION__ << std::endl; }

}

int main()
{
to_function_pointer(f)();
to_function_pointer(&f)();
to_function_pointer([] () { std::cout << __PRETTY_FUNCTION__ << std::endl; })();
to_function_pointer([] () mutable { std::cout << __PRETTY_FUNCTION__ << std::endl; })();
return EXIT_SUCCESS;
}

За #if 0 функция to_function_pointer Из кода нельзя конвертировать лямбду в соответствующий указатель функции. Означает ли это, что упомянутый оператор «неявно» помечен explicit ключевое слово? Есть ли соответствующая оговорка из стандарта?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector