disable recursive wrapper types

This commit is contained in:
BlackMATov
2021-08-16 08:03:46 +07:00
parent beb9e6dea3
commit 044590e782
2 changed files with 16 additions and 10 deletions

View File

@@ -164,7 +164,10 @@ namespace meta_hpp
arg(const arg&) = delete;
arg& operator=(const arg&) = delete;
template < typename T >
template < typename T
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, arg>, int> = 0
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, inst>, int> = 0
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, value>, int> = 0 >
explicit arg(T&& v);
template < typename To >
@@ -176,7 +179,10 @@ namespace meta_hpp
namespace meta_hpp
{
template < typename T >
template < typename T
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, arg>, int>
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, inst>, int>
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, value>, int> >
arg::arg(T&& v)
: arg_base{typename_arg<T&&>}
, data_{const_cast<stdex::remove_cvref_t<T>*>(std::addressof(v))} {}

View File

@@ -136,10 +136,10 @@ namespace meta_hpp
inst(const inst&) = delete;
inst& operator=(const inst&) = delete;
template < typename T, std::enable_if_t<
std::is_class_v<T> ||
(std::is_reference_v<T> && std::is_class_v<std::remove_reference_t<T>>)
, int> = 0 >
template < typename T
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, arg>, int> = 0
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, inst>, int> = 0
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, value>, int> = 0 >
explicit inst(T&& v);
template < typename To >
@@ -151,10 +151,10 @@ namespace meta_hpp
namespace meta_hpp
{
template < typename T, std::enable_if_t<
std::is_class_v<T> ||
(std::is_reference_v<T> && std::is_class_v<std::remove_reference_t<T>>)
, int> >
template < typename T
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, arg>, int>
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, inst>, int>
, std::enable_if_t<!std::is_same_v<std::decay_t<T>, value>, int> >
inst::inst(T&& v)
: inst_base{typename_arg<T&&>}
, data_{const_cast<stdex::remove_cvref_t<T>*>(std::addressof(v))} {}