fix return local scope variable after cast

This commit is contained in:
BlackMATov
2021-07-13 15:01:27 +07:00
parent 093c1fffc6
commit ae9c4b11b4
6 changed files with 33 additions and 36 deletions

View File

@@ -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 >

View File

@@ -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 >

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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 >