Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <type_traits>
- #include <utility>
- template <typename F>
- struct lambda_traits : lambda_traits<decltype(&F::operator())> {};
- template <typename F, typename R, typename... Args>
- struct lambda_traits<R(F::*)(Args...)> {
- using ptr_t = std::add_pointer_t<R(Args...)>;
- static inline ptr_t to_fptr(F&& f) {
- static F fn = std::forward<F>(f);
- return [](Args... args) {
- return fn(std::forward<Args>(args)...);
- };
- }
- };
- template <typename F, typename R, typename... Args>
- struct lambda_traits<R(F::*)(Args...) noexcept>
- {
- using ptr_t = std::add_pointer_t<R(Args...)>;
- static inline auto to_fptr(F&& f) -> ptr_t {
- static F fn = std::forward<F>(f);
- return [](Args... args) {
- return fn(std::forward<Args>(args)...);
- };
- }
- };
- template <typename F, typename R, typename... Args>
- struct lambda_traits<R(F::*)(Args...) const>
- {
- using ptr_t = std::add_pointer_t<R(Args...)>;
- static inline auto to_fptr(F&& f) -> ptr_t {
- static F fn = std::forward<F>(f);
- return [](Args... args) {
- return fn(std::forward<Args>(args)...);
- };
- }
- };
- template <typename F, typename R, typename... Args>
- struct lambda_traits<R(F::*)(Args...) const noexcept>
- {
- using ptr_t = std::add_pointer_t<R(Args...)>;
- static inline auto to_fptr(F&& f) -> ptr_t {
- static F fn = std::forward<F>(f);
- return [](Args... args) {
- return fn(std::forward<Args>(args)...);
- };
- }
- };
- template <class F>
- inline auto to_fptr(F&& f) {
- return lambda_traits<F>::to_fptr(std::forward<F>(f));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement