mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-16 22:17:02 +07:00
fix return local scope variable after cast
This commit is contained in:
@@ -131,9 +131,9 @@ namespace meta_hpp
|
||||
}
|
||||
}
|
||||
|
||||
template < typename R, typename... Args >
|
||||
R invoke_r(Args&&... args) const {
|
||||
return invoke(std::forward<Args>(args)...).template cast<R>();
|
||||
template < typename R, typename Rp = std::decay_t<R>, typename... Args >
|
||||
Rp invoke_r(Args&&... args) const {
|
||||
return invoke(std::forward<Args>(args)...).template cast<Rp>();
|
||||
}
|
||||
|
||||
template < typename... Args >
|
||||
|
||||
@@ -122,9 +122,9 @@ namespace meta_hpp
|
||||
return getter_(instance);
|
||||
}
|
||||
|
||||
template < typename R >
|
||||
R get_r(cinstance instance) const {
|
||||
return get(instance).cast<R>();
|
||||
template < typename R, typename Rp = std::decay_t<R> >
|
||||
Rp get_r(cinstance instance) const {
|
||||
return get(instance).template cast<Rp>();
|
||||
}
|
||||
|
||||
template < typename Value >
|
||||
|
||||
@@ -134,10 +134,10 @@ namespace meta_hpp
|
||||
}
|
||||
}
|
||||
|
||||
template < typename R, typename... Args >
|
||||
std::optional<R> invoke_r(Args&&... args) const {
|
||||
template < typename R, typename Rp = std::decay_t<R>, typename... Args >
|
||||
std::optional<Rp> invoke_r(Args&&... args) const {
|
||||
if ( std::optional<value> r = invoke(std::forward<Args>(args)...) ) {
|
||||
return std::move(r)->template cast<R>();
|
||||
return std::move(r)->template cast<Rp>();
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -222,10 +222,10 @@ namespace meta_hpp
|
||||
}
|
||||
}
|
||||
|
||||
template < typename R, typename T, typename... Args >
|
||||
std::optional<R> invoke_r(T& inst, Args&&... args) const {
|
||||
template < typename R, typename Rp = std::decay_t<R>, typename T, typename... Args >
|
||||
std::optional<Rp> invoke_r(T& inst, Args&&... args) const {
|
||||
if ( std::optional<value> r = invoke(inst, std::forward<Args>(args)...) ) {
|
||||
return std::move(r)->template cast<R>();
|
||||
return std::move(r)->template cast<Rp>();
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -53,33 +53,31 @@ namespace meta_hpp
|
||||
value& operator=(value&&) = default;
|
||||
value& operator=(const value&) = default;
|
||||
|
||||
template < typename T
|
||||
, typename U = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<U, value>> >
|
||||
template < typename T, typename Tp = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<Tp, value>> >
|
||||
value(T&& val)
|
||||
: raw_{std::forward<T>(val)}
|
||||
, fid_{get_family_id<U>()}
|
||||
, traits_{value_detail::get_traits<U>()} {}
|
||||
, fid_{get_family_id<Tp>()}
|
||||
, traits_{value_detail::get_traits<Tp>()} {}
|
||||
|
||||
template < typename T
|
||||
, typename U = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<U, value>> >
|
||||
template < typename T, typename Tp = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<Tp, value>> >
|
||||
value& operator=(T&& val) {
|
||||
value{std::forward<T>(val)}.swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template < typename T, typename U = std::decay_t<T>, typename... Args >
|
||||
template < typename T, typename Tp = std::decay_t<T>, typename... Args >
|
||||
explicit value(std::in_place_type_t<T>, Args&&... args)
|
||||
: raw_{std::in_place_type<U>, std::forward<Args>(args)...}
|
||||
, fid_{get_family_id<U>()}
|
||||
, traits_{value_detail::get_traits<U>()} {}
|
||||
: raw_{std::in_place_type<Tp>, std::forward<Args>(args)...}
|
||||
, fid_{get_family_id<Tp>()}
|
||||
, traits_{value_detail::get_traits<Tp>()} {}
|
||||
|
||||
template < typename T, typename U = std::decay_t<T>, typename I, typename... Args >
|
||||
template < typename T, typename Tp = std::decay_t<T>, typename I, typename... Args >
|
||||
explicit value(std::in_place_type_t<T>, std::initializer_list<I> ilist, Args&&... args)
|
||||
: raw_{std::in_place_type<U>, ilist, std::forward<Args>(args)...}
|
||||
, fid_{get_family_id<U>()}
|
||||
, traits_{value_detail::get_traits<U>()} {}
|
||||
: raw_{std::in_place_type<Tp>, ilist, std::forward<Args>(args)...}
|
||||
, fid_{get_family_id<Tp>()}
|
||||
, traits_{value_detail::get_traits<Tp>()} {}
|
||||
|
||||
template < typename T >
|
||||
bool has_type() const noexcept {
|
||||
@@ -134,12 +132,11 @@ namespace meta_hpp
|
||||
swap(traits_, other.traits_);
|
||||
}
|
||||
|
||||
template < typename T
|
||||
, typename U = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<U, value>> >
|
||||
template < typename T, typename Tp = std::decay_t<T>
|
||||
, typename = std::enable_if_t<!std::is_same_v<Tp, value>> >
|
||||
bool equals(T&& other) const {
|
||||
return fid_ == get_family_id<U>()
|
||||
&& std::equal_to<>{}(*try_cast<U>(), std::forward<T>(other));
|
||||
return fid_ == get_family_id<Tp>()
|
||||
&& std::equal_to<>{}(*try_cast<Tp>(), std::forward<T>(other));
|
||||
}
|
||||
|
||||
bool equals(const value& other) const {
|
||||
|
||||
@@ -96,9 +96,9 @@ namespace meta_hpp
|
||||
return getter_();
|
||||
}
|
||||
|
||||
template < typename R >
|
||||
R get_r() const {
|
||||
return get().cast<R>();
|
||||
template < typename R, typename Rp = std::decay_t<R> >
|
||||
Rp get_r() const {
|
||||
return get().template cast<Rp>();
|
||||
}
|
||||
|
||||
template < typename Value >
|
||||
|
||||
Reference in New Issue
Block a user