ref-qualifiers for binds

This commit is contained in:
BlackMATov
2023-08-11 02:07:09 +07:00
parent 8ecabad7bc
commit 03fbc72400
5 changed files with 273 additions and 55 deletions

View File

@@ -7,12 +7,12 @@
- register base types by `META_HPP_ENABLE_POLY_INFO`
- fix all includes to work with the library more flexible
- test and support shared libraries
- remove `resolve_poly_type`, use `resolve_type(T&&)` instead
- add `match` function to `any_type` class
## Thoughts
- should `uvalue` dereference operators return `reference_wrapper`?
- `array_view`/`pointer_view` instead `unmap`/`operator[]`/`operator*`?
- can we add move-only uvalue analog to return move-only values?
- store only `hashed_string` in indices instead `string`
## Version 1.0

View File

@@ -4586,30 +4586,56 @@ namespace meta_hpp
explicit class_bind(metadata_map metadata);
template < detail::class_bind_base_kind<Class>... Bases >
class_bind& base_();
class_bind& base_() &;
template < detail::class_bind_base_kind<Class>... Bases >
class_bind base_() &&;
template < typename... Args, typename... Opts >
class_bind& constructor_(Opts&&... opts)
requires detail::class_bind_constructor_kind<Class, Args...>;
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind& constructor_(Opts&&... opts) &;
template < typename... Args, typename... Opts >
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind constructor_(Opts&&... opts) &&;
template < typename... Opts >
class_bind& destructor_(Opts&&... opts)
requires detail::class_bind_destructor_kind<Class>;
requires detail::class_bind_destructor_kind<Class>
class_bind& destructor_(Opts&&... opts) &;
template < typename... Opts >
requires detail::class_bind_destructor_kind<Class>
class_bind destructor_(Opts&&... opts) &&;
template < detail::function_pointer_kind Function, typename... Opts >
class_bind& function_(std::string name, Function function_ptr, Opts&&... opts);
class_bind& function_(std::string name, Function function_ptr, Opts&&... opts) &;
template < detail::function_pointer_kind Function, typename... Opts >
class_bind function_(std::string name, Function function_ptr, Opts&&... opts) &&;
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind& member_(std::string name, Member member_ptr, Opts&&... opts);
class_bind& member_(std::string name, Member member_ptr, Opts&&... opts) &;
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind member_(std::string name, Member member_ptr, Opts&&... opts) &&;
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind& method_(std::string name, Method method_ptr, Opts&&... opts);
class_bind& method_(std::string name, Method method_ptr, Opts&&... opts) &;
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind method_(std::string name, Method method_ptr, Opts&&... opts) &&;
template < typename Type >
class_bind& typedef_(std::string name);
class_bind& typedef_(std::string name) &;
template < typename Type >
class_bind typedef_(std::string name) &&;
template < detail::pointer_kind Pointer, typename... Opts >
class_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts);
class_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &;
template < detail::pointer_kind Pointer, typename... Opts >
class_bind variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &&;
};
}
@@ -4704,13 +4730,22 @@ namespace meta_hpp
explicit scope_bind(const scope& scope, metadata_map metadata);
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind& function_(std::string name, Function function_ptr, Opts&&... opts);
scope_bind& function_(std::string name, Function function_ptr, Opts&&... opts) &;
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind function_(std::string name, Function function_ptr, Opts&&... opts) &&;
template < typename Type >
scope_bind& typedef_(std::string name);
scope_bind& typedef_(std::string name) &;
template < typename Type >
scope_bind typedef_(std::string name) &&;
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts);
scope_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &;
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &&;
};
}
@@ -5089,7 +5124,7 @@ namespace meta_hpp
template < detail::class_kind Class >
template < detail::class_bind_base_kind<Class>... Bases >
class_bind<Class>& class_bind<Class>::base_() {
class_bind<Class>& class_bind<Class>::base_() & {
using namespace detail;
using namespace detail::class_bind_impl;
@@ -5130,11 +5165,17 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_base_kind<Class>... Bases >
class_bind<Class> class_bind<Class>::base_() && {
base_<Bases...>();
return std::move(*this);
}
template < detail::class_kind Class >
template < typename... Args, typename... Opts >
class_bind<Class>& class_bind<Class>::constructor_(Opts&&... opts)
requires detail::class_bind_constructor_kind<Class, Args...>
{
class_bind<Class>& class_bind<Class>::constructor_(Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<constructor_policy::is_family, constructor_policy::as_object_t, opts_t>;
@@ -5175,11 +5216,18 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < typename... Args, typename... Opts >
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind<Class> class_bind<Class>::constructor_(Opts&&... opts) && {
constructor_<Args...>(std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < typename... Opts >
class_bind<Class>& class_bind<Class>::destructor_(Opts&&... opts)
requires detail::class_bind_destructor_kind<Class>
{
class_bind<Class>& class_bind<Class>::destructor_(Opts&&... opts) & {
metadata_bind metadata;
{
@@ -5196,9 +5244,17 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < typename... Opts >
requires detail::class_bind_destructor_kind<Class>
class_bind<Class> class_bind<Class>::destructor_(Opts&&... opts) && {
destructor_(std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::function_pointer_kind Function, typename... Opts >
class_bind<Class>& class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<function_policy::is_family, function_policy::as_copy_t, opts_t>;
@@ -5239,9 +5295,16 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::function_pointer_kind Function, typename... Opts >
class_bind<Class> class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) && {
function_(std::move(name), function_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind<Class>& class_bind<Class>::member_(std::string name, Member member_ptr, [[maybe_unused]] Opts&&... opts) {
class_bind<Class>& class_bind<Class>::member_(std::string name, Member member_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<member_policy::is_family, member_policy::as_copy_t, opts_t>;
@@ -5267,9 +5330,16 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind<Class> class_bind<Class>::member_(std::string name, Member member_ptr, Opts&&... opts) && {
member_(std::move(name), member_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind<Class>& class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<method_policy::is_family, method_policy::as_copy_t, opts_t>;
@@ -5310,16 +5380,30 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind<Class> class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) && {
method_(std::move(name), method_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < typename Type >
class_bind<Class>& class_bind<Class>::typedef_(std::string name) {
class_bind<Class>& class_bind<Class>::typedef_(std::string name) & {
get_data().typedefs.insert_or_assign(std::move(name), resolve_type<Type>());
return *this;
}
template < detail::class_kind Class >
template < typename Type >
class_bind<Class> class_bind<Class>::typedef_(std::string name) && {
typedef_<Type>(std::move(name));
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::pointer_kind Pointer, typename... Opts >
class_bind<Class>& class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<variable_policy::is_family, variable_policy::as_copy_t, opts_t>;
@@ -5344,6 +5428,13 @@ namespace meta_hpp
detail::insert_or_assign(get_data().variables, variable{std::move(state)});
return *this;
}
template < detail::class_kind Class >
template < detail::pointer_kind Pointer, typename... Opts >
class_bind<Class> class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) && {
variable_(std::move(name), variable_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
}
namespace meta_hpp
@@ -5433,7 +5524,7 @@ namespace meta_hpp
: state_bind_base{scope, std::move(metadata)} {}
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind& scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) {
scope_bind& scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<function_policy::is_family, function_policy::as_copy_t, opts_t>;
@@ -5474,14 +5565,26 @@ namespace meta_hpp
return *this;
}
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) && {
function_(std::move(name), function_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < typename Type >
scope_bind& scope_bind::typedef_(std::string name) {
scope_bind& scope_bind::typedef_(std::string name) & {
get_state().typedefs.insert_or_assign(std::move(name), resolve_type<Type>());
return *this;
}
template < typename Type >
scope_bind scope_bind::typedef_(std::string name) && {
typedef_<Type>(std::move(name));
return std::move(*this);
}
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind& scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) {
scope_bind& scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<variable_policy::is_family, variable_policy::as_copy_t, opts_t>;
@@ -5506,6 +5609,12 @@ namespace meta_hpp
detail::insert_or_assign(get_state().variables, variable{std::move(state)});
return *this;
}
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) && {
variable_(std::move(name), variable_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
}
namespace meta_hpp

View File

@@ -108,30 +108,56 @@ namespace meta_hpp
explicit class_bind(metadata_map metadata);
template < detail::class_bind_base_kind<Class>... Bases >
class_bind& base_();
class_bind& base_() &;
template < detail::class_bind_base_kind<Class>... Bases >
class_bind base_() &&;
template < typename... Args, typename... Opts >
class_bind& constructor_(Opts&&... opts)
requires detail::class_bind_constructor_kind<Class, Args...>;
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind& constructor_(Opts&&... opts) &;
template < typename... Args, typename... Opts >
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind constructor_(Opts&&... opts) &&;
template < typename... Opts >
class_bind& destructor_(Opts&&... opts)
requires detail::class_bind_destructor_kind<Class>;
requires detail::class_bind_destructor_kind<Class>
class_bind& destructor_(Opts&&... opts) &;
template < typename... Opts >
requires detail::class_bind_destructor_kind<Class>
class_bind destructor_(Opts&&... opts) &&;
template < detail::function_pointer_kind Function, typename... Opts >
class_bind& function_(std::string name, Function function_ptr, Opts&&... opts);
class_bind& function_(std::string name, Function function_ptr, Opts&&... opts) &;
template < detail::function_pointer_kind Function, typename... Opts >
class_bind function_(std::string name, Function function_ptr, Opts&&... opts) &&;
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind& member_(std::string name, Member member_ptr, Opts&&... opts);
class_bind& member_(std::string name, Member member_ptr, Opts&&... opts) &;
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind member_(std::string name, Member member_ptr, Opts&&... opts) &&;
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind& method_(std::string name, Method method_ptr, Opts&&... opts);
class_bind& method_(std::string name, Method method_ptr, Opts&&... opts) &;
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind method_(std::string name, Method method_ptr, Opts&&... opts) &&;
template < typename Type >
class_bind& typedef_(std::string name);
class_bind& typedef_(std::string name) &;
template < typename Type >
class_bind typedef_(std::string name) &&;
template < detail::pointer_kind Pointer, typename... Opts >
class_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts);
class_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &;
template < detail::pointer_kind Pointer, typename... Opts >
class_bind variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &&;
};
}
@@ -226,13 +252,22 @@ namespace meta_hpp
explicit scope_bind(const scope& scope, metadata_map metadata);
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind& function_(std::string name, Function function_ptr, Opts&&... opts);
scope_bind& function_(std::string name, Function function_ptr, Opts&&... opts) &;
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind function_(std::string name, Function function_ptr, Opts&&... opts) &&;
template < typename Type >
scope_bind& typedef_(std::string name);
scope_bind& typedef_(std::string name) &;
template < typename Type >
scope_bind typedef_(std::string name) &&;
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts);
scope_bind& variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &;
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind variable_(std::string name, Pointer variable_ptr, Opts&&... opts) &&;
};
}

View File

@@ -99,7 +99,7 @@ namespace meta_hpp
template < detail::class_kind Class >
template < detail::class_bind_base_kind<Class>... Bases >
class_bind<Class>& class_bind<Class>::base_() {
class_bind<Class>& class_bind<Class>::base_() & {
using namespace detail;
using namespace detail::class_bind_impl;
@@ -140,11 +140,17 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_base_kind<Class>... Bases >
class_bind<Class> class_bind<Class>::base_() && {
base_<Bases...>();
return std::move(*this);
}
template < detail::class_kind Class >
template < typename... Args, typename... Opts >
class_bind<Class>& class_bind<Class>::constructor_(Opts&&... opts)
requires detail::class_bind_constructor_kind<Class, Args...>
{
class_bind<Class>& class_bind<Class>::constructor_(Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<constructor_policy::is_family, constructor_policy::as_object_t, opts_t>;
@@ -185,11 +191,18 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < typename... Args, typename... Opts >
requires detail::class_bind_constructor_kind<Class, Args...>
class_bind<Class> class_bind<Class>::constructor_(Opts&&... opts) && {
constructor_<Args...>(std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < typename... Opts >
class_bind<Class>& class_bind<Class>::destructor_(Opts&&... opts)
requires detail::class_bind_destructor_kind<Class>
{
class_bind<Class>& class_bind<Class>::destructor_(Opts&&... opts) & {
metadata_bind metadata;
{
@@ -206,9 +219,17 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < typename... Opts >
requires detail::class_bind_destructor_kind<Class>
class_bind<Class> class_bind<Class>::destructor_(Opts&&... opts) && {
destructor_(std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::function_pointer_kind Function, typename... Opts >
class_bind<Class>& class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<function_policy::is_family, function_policy::as_copy_t, opts_t>;
@@ -249,9 +270,16 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::function_pointer_kind Function, typename... Opts >
class_bind<Class> class_bind<Class>::function_(std::string name, Function function_ptr, Opts&&... opts) && {
function_(std::move(name), function_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind<Class>& class_bind<Class>::member_(std::string name, Member member_ptr, [[maybe_unused]] Opts&&... opts) {
class_bind<Class>& class_bind<Class>::member_(std::string name, Member member_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<member_policy::is_family, member_policy::as_copy_t, opts_t>;
@@ -277,9 +305,16 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_member_kind<Class> Member, typename... Opts >
class_bind<Class> class_bind<Class>::member_(std::string name, Member member_ptr, Opts&&... opts) && {
member_(std::move(name), member_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind<Class>& class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<method_policy::is_family, method_policy::as_copy_t, opts_t>;
@@ -320,16 +355,30 @@ namespace meta_hpp
return *this;
}
template < detail::class_kind Class >
template < detail::class_bind_method_kind<Class> Method, typename... Opts >
class_bind<Class> class_bind<Class>::method_(std::string name, Method method_ptr, Opts&&... opts) && {
method_(std::move(name), method_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < detail::class_kind Class >
template < typename Type >
class_bind<Class>& class_bind<Class>::typedef_(std::string name) {
class_bind<Class>& class_bind<Class>::typedef_(std::string name) & {
get_data().typedefs.insert_or_assign(std::move(name), resolve_type<Type>());
return *this;
}
template < detail::class_kind Class >
template < typename Type >
class_bind<Class> class_bind<Class>::typedef_(std::string name) && {
typedef_<Type>(std::move(name));
return std::move(*this);
}
template < detail::class_kind Class >
template < detail::pointer_kind Pointer, typename... Opts >
class_bind<Class>& class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) {
class_bind<Class>& class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<variable_policy::is_family, variable_policy::as_copy_t, opts_t>;
@@ -354,4 +403,11 @@ namespace meta_hpp
detail::insert_or_assign(get_data().variables, variable{std::move(state)});
return *this;
}
template < detail::class_kind Class >
template < detail::pointer_kind Pointer, typename... Opts >
class_bind<Class> class_bind<Class>::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) && {
variable_(std::move(name), variable_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
}

View File

@@ -16,7 +16,7 @@ namespace meta_hpp
: state_bind_base{scope, std::move(metadata)} {}
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind& scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) {
scope_bind& scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<function_policy::is_family, function_policy::as_copy_t, opts_t>;
@@ -57,14 +57,26 @@ namespace meta_hpp
return *this;
}
template < detail::function_pointer_kind Function, typename... Opts >
scope_bind scope_bind::function_(std::string name, Function function_ptr, Opts&&... opts) && {
function_(std::move(name), function_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
template < typename Type >
scope_bind& scope_bind::typedef_(std::string name) {
scope_bind& scope_bind::typedef_(std::string name) & {
get_state().typedefs.insert_or_assign(std::move(name), resolve_type<Type>());
return *this;
}
template < typename Type >
scope_bind scope_bind::typedef_(std::string name) && {
typedef_<Type>(std::move(name));
return std::move(*this);
}
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind& scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) {
scope_bind& scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) & {
using opts_t = detail::type_list<std::remove_cvref_t<Opts>...>;
using policy_t = detail::type_list_first_of_t<variable_policy::is_family, variable_policy::as_copy_t, opts_t>;
@@ -89,4 +101,10 @@ namespace meta_hpp
detail::insert_or_assign(get_state().variables, variable{std::move(state)});
return *this;
}
template < detail::pointer_kind Pointer, typename... Opts >
scope_bind scope_bind::variable_(std::string name, Pointer variable_ptr, Opts&&... opts) && {
variable_(std::move(name), variable_ptr, std::forward<Opts>(opts)...);
return std::move(*this);
}
}