Function template proxy_cast
// (1)
template <class T>
T proxy_cast(const proxy_indirect_accessor<F>& operand);
// (2)
template <class T>
T proxy_cast(proxy_indirect_accessor<F>& operand);
// (3)
template <class T>
T proxy_cast(proxy_indirect_accessor<F>&& operand);
// (4)
template <class T>
T proxy_cast(const proxy<F>& operand);
// (5)
template <class T>
T proxy_cast(proxy<F>& operand);
// (6)
template <class T>
T proxy_cast(proxy<F>&& operand);
// (7)
template <class T>
const T* proxy_cast(const proxy_indirect_accessor<F>* operand) noexcept;
// (8)
template <class T>
T* proxy_cast(proxy_indirect_accessor<F>* operand) noexcept;
// (9)
template <class T>
const T* proxy_cast(const proxy<F>* operand) noexcept;
// (10)
template <class T>
T* proxy_cast(proxy<F>* operand) noexcept;
Performs type-safe access to the contained object of proxy<F>
where F
is a facade type built from skill rtti
, indirect_rtti
or direct_rtti
.
(1-3)
Letp
beaccess_proxy
<F>(operand)
,ptr
be the contained value ofp
(if any). Ifp
does not contain a value orstd::is_same_v<std::decay_t<decltype(expr)>, std::decay_t<T>>
isfalse
, throwsbad_proxy_cast
. Otherwise, returnsstatic_cast<T>(expr)
. Specifically,expr
is defined as(1)
:*std::as_const(ptr)
.(2)
:*ptr
.(3)
:*std::move(ptr)
.
(4-6)
Letptr
be the contained value ofoperand
(if any). Ifoperand
does not contain a value orstd::is_same_v<std::decay_t<ptr>, std::decay_t<T>>
isfalse
, throwsbad_proxy_cast
. Otherwise, returnsstatic_cast<T>(expr)
. Specifically,expr
is defined as(6)
:std::as_const(ptr)
.(7)
:ptr
.(8)
:std::move(ptr)
.
(7-10)
Returns&proxy_cast<T>(*operand)
if the evaluation won't throw, or otherwise, returnsnullptr
.
These functions are not visible to ordinary unqualified or qualified lookup. It can only be found by argument-dependent lookup when proxy_indirect_accessor<F>
(for rtti
or indirect_rtti
) or proxy<F>
(for direct_rtti
) is an associated class of the arguments. Usage of these functions is similar to std::any_cast
.
Example
#include <iostream>
#include <proxy/proxy.h>
struct RttiAware : pro::facade_builder
::support<pro::skills::rtti>
::build {};
int main() {
int v = 123;
pro::proxy<RttiAware> p;
try {
proxy_cast<int>(*p); // Throws
} catch (const pro::bad_proxy_cast& e) {
std::cout << e.what() << "\n"; // Prints an explanatory string
}
p = &v;
std::cout << proxy_cast<int>(*p) << "\n"; // Prints "123"
proxy_cast<int&>(*p) = 456;
std::cout << v << "\n"; // Prints "456"
try {
proxy_cast<double>(*p); // Throws
} catch (const pro::bad_proxy_cast& e) {
std::cout << e.what() << "\n"; // Prints an explanatory string
}
int* ptr1 = proxy_cast<int>(&*p);
std::cout << ptr1 << "\n"; // Prints an address
std::cout << &v << "\n"; // Prints the same address as above
double* ptr2 = proxy_cast<double>(&*p);
std::cout << ptr2 << "\n"; // Prints "0"
}