facade_aware_overload_t
template <template <class> class O>
struct facade_aware_overload_t { facade_aware_overload_t() = delete; };
Class template facade_aware_overload_t<O>
specifies a facade-aware overload template O
. It is useful when modeling an overload type of a facade type that recursively depends on the facade type itself.
facade_aware_overload_t
can be used to define a convention in a base facade type, and is portable to the definition of another facade type via basic_facade_builder::add_facade
. It can also effectively avoid a facade type being implicitly instantiated when it is incomplete.
#include <iostream>
#include "proxy.h"
template <class F>
using BinaryOverload = pro::proxy<F>(const pro::proxy_indirect_accessor<F>& rhs) const;
template <class T, pro::facade F>
pro::proxy<F> operator+(const T& value, const pro::proxy_indirect_accessor<F>& rhs)
requires(!std::is_same_v<T, pro::proxy_indirect_accessor<F>>)
{ return pro::make_proxy<F, T>(value + proxy_cast<const T&>(rhs)); }
struct Addable : pro::facade_builder
::support_rtti
::support_format
::add_convention<pro::operator_dispatch<"+">, pro::facade_aware_overload_t<BinaryOverload>>
::build {};
int main() {
pro::proxy<Addable> p1 = pro::make_proxy<Addable>(1);
pro::proxy<Addable> p2 = pro::make_proxy<Addable>(2);
pro::proxy<Addable> p3 = *p1 + *p2;
std::cout << std::format("{}\n", *p3); // Prints "3"
}