#pragma once namespace cpputils { template struct CppNonConstOverload { template constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; } }; template struct CppConstOverload { template constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr) { return ptr; } }; template struct CppOverload : CppConstOverload, CppNonConstOverload { using CppConstOverload::of; using CppConstOverload::operator(); using CppNonConstOverload::of; using CppNonConstOverload::operator(); template constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) { return ptr; } template static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; } }; template constexpr __attribute__((__unused__)) CppOverload cppOverload = {}; template constexpr __attribute__((__unused__)) CppConstOverload cppConstOverload = {}; template constexpr __attribute__((__unused__)) CppNonConstOverload cppNonConstOverload = {}; } // namespace cpputils