// // default_constructible_function_proxy.h // iterator // // Created by Sam Jaffe on 4/1/23. // Copyright © 2023 Sam Jaffe. All rights reserved. // #include #include namespace iterator::detail { template class default_constructible_function_proxy { public: default_constructible_function_proxy() = default; default_constructible_function_proxy(F func) : func_(func) {} template decltype(auto) operator()(Args &&... args) const { if (!func_) { throw; } return std::invoke(*func_, FWD(args)...); } private: std::optional func_; }; template class default_constructible_function_proxy< F, std::enable_if_t>> { public: default_constructible_function_proxy() = default; default_constructible_function_proxy(F func) : func_(func) {} template decltype(auto) operator()(Args &&... args) const { return std::invoke(func_, FWD(args)...); } private: F func_; }; } #include