parent
f7b2f34053
commit
70ca094db8
2 changed files with 21 additions and 2 deletions
|
@ -979,14 +979,16 @@ union union_type {
|
|||
};
|
||||
|
||||
template <typename T>
|
||||
inline constexpr auto static_v = T{};
|
||||
struct union_type_holder {
|
||||
constexpr static union_type<T> value;
|
||||
};
|
||||
|
||||
template <auto V>
|
||||
constexpr auto get_member_name() noexcept {
|
||||
if constexpr (std::is_member_function_pointer_v<decltype(V)>) {
|
||||
return n<V>();
|
||||
} else {
|
||||
return n<V, &(static_v<union_type<decltype(get_base_type(V))>>.f.*V)>();
|
||||
return n<V, &(union_type_holder<decltype(get_base_type(V))>::value.f.*V)>();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -118,6 +118,19 @@ struct TestRtti{
|
|||
struct Derived : Base {};
|
||||
};
|
||||
|
||||
#if defined(NAMEOF_MEMBER_SUPPORTED) && NAMEOF_MEMBER_SUPPORTED
|
||||
|
||||
struct StructMemberInitializationUsingNameof{
|
||||
std::string teststringfield = std::string{nameof::nameof_member<&StructMemberInitializationUsingNameof::teststringfield>()};
|
||||
};
|
||||
|
||||
struct StructWithNonConstexprDestructor{
|
||||
~StructWithNonConstexprDestructor(){}
|
||||
int somefield;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
SomeStruct struct_var;
|
||||
Long othervar;
|
||||
SomeStruct* ptr_s = &struct_var;
|
||||
|
@ -916,6 +929,8 @@ TEST_CASE("NAMEOF_MEMBER") {
|
|||
REQUIRE(NAMEOF_MEMBER(&Long::LL::field) == "field");
|
||||
constexpr auto member_ptr = &SomeStruct::somefield;
|
||||
REQUIRE(NAMEOF_MEMBER(member_ptr) == "somefield");
|
||||
REQUIRE(NAMEOF_MEMBER(&StructMemberInitializationUsingNameof::teststringfield) == "teststringfield");
|
||||
REQUIRE(NAMEOF_MEMBER(&StructWithNonConstexprDestructor::somefield) == "somefield");
|
||||
}
|
||||
|
||||
TEST_CASE("nameof_member") {
|
||||
|
@ -924,6 +939,8 @@ TEST_CASE("nameof_member") {
|
|||
REQUIRE(nameof::nameof_member<&Long::LL::field>() == "field");
|
||||
constexpr auto member_ptr = &SomeStruct::somefield;
|
||||
REQUIRE(nameof::nameof_member<member_ptr>() == "somefield");
|
||||
REQUIRE(nameof::nameof_member<&StructMemberInitializationUsingNameof::teststringfield>() == "teststringfield");
|
||||
REQUIRE(nameof::nameof_member<&StructWithNonConstexprDestructor::somefield>() == "somefield");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue