mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-15 11:52:08 +07:00
class_bind.base_ for multiple bases
This commit is contained in:
@@ -3340,9 +3340,9 @@ namespace meta_hpp
|
||||
|
||||
// base_
|
||||
|
||||
template < detail::class_kind Base >
|
||||
template < detail::class_kind... Bases >
|
||||
class_bind& base_()
|
||||
requires detail::class_bind_base_kind<Class, Base>;
|
||||
requires (... && detail::class_bind_base_kind<Class, Bases>);
|
||||
|
||||
// constructor_
|
||||
|
||||
@@ -3824,26 +3824,28 @@ namespace meta_hpp
|
||||
//
|
||||
|
||||
template < detail::class_kind Class >
|
||||
template < detail::class_kind Base >
|
||||
template < detail::class_kind... Bases >
|
||||
class_bind<Class>& class_bind<Class>::base_()
|
||||
requires detail::class_bind_base_kind<Class, Base>
|
||||
requires (... && detail::class_bind_base_kind<Class, Bases>)
|
||||
{
|
||||
const class_type base_type = resolve_type<Base>();
|
||||
([this]<detail::class_kind Base>(std::in_place_type_t<Base>) {
|
||||
const class_type base_type = resolve_type<Base>();
|
||||
|
||||
if ( auto&& [_, success] = data_->bases.emplace(base_type); !success ) {
|
||||
return *this;
|
||||
}
|
||||
if ( auto&& [_, success] = data_->bases.emplace(base_type); !success ) {
|
||||
return;
|
||||
}
|
||||
|
||||
META_HPP_TRY {
|
||||
data_->bases_info.emplace(base_type, detail::class_type_data::base_info{
|
||||
.upcast = +[](void* derived) -> void* {
|
||||
return static_cast<Base*>(static_cast<Class*>(derived));
|
||||
}
|
||||
});
|
||||
} META_HPP_CATCH(...) {
|
||||
data_->bases.erase(base_type);
|
||||
META_HPP_RETHROW();
|
||||
}
|
||||
META_HPP_TRY {
|
||||
data_->bases_info.emplace(base_type, detail::class_type_data::base_info{
|
||||
.upcast = +[](void* derived) -> void* {
|
||||
return static_cast<Base*>(static_cast<Class*>(derived));
|
||||
}
|
||||
});
|
||||
} META_HPP_CATCH(...) {
|
||||
data_->bases.erase(base_type);
|
||||
META_HPP_RETHROW();
|
||||
}
|
||||
}(std::in_place_type<Bases>), ...);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@ TEST_CASE("meta/meta_types/class_type") {
|
||||
|
||||
meta::class_<base_clazz_1>()
|
||||
.constructor_<int>()
|
||||
.base_<>()
|
||||
.member_("base_member_1", &base_clazz_1::base_member_1)
|
||||
.method_("base_method_1", &base_clazz_1::base_method_1)
|
||||
.function_("base_function_1", &base_clazz_1::base_function_1)
|
||||
@@ -81,8 +82,7 @@ TEST_CASE("meta/meta_types/class_type") {
|
||||
|
||||
meta::class_<derived_clazz>()
|
||||
.constructor_<int, float>()
|
||||
.base_<base_clazz_1>()
|
||||
.base_<base_clazz_2>()
|
||||
.base_<base_clazz_1, base_clazz_2>()
|
||||
.member_("derived_member", &derived_clazz::derived_member)
|
||||
.method_("derived_method", &derived_clazz::derived_method)
|
||||
.function_("derived_function", &derived_clazz::derived_function)
|
||||
|
||||
Reference in New Issue
Block a user