fix: const enum signature_of ambiguity error (#444)

This fixes the template specialization ambiguity error when a signature_of applied upon a const (and/or volatile) enum type would render the const specialization and the enum specialization as two equally-ranked candidates.
This commit is contained in:
Stanislav Angelovič
2024-05-15 15:46:24 +02:00
committed by GitHub
parent e6b87b106c
commit c6705faf2f
3 changed files with 22 additions and 5 deletions

View File

@ -140,6 +140,10 @@ namespace sdbus {
struct signature_of<volatile _T> : signature_of<_T> struct signature_of<volatile _T> : signature_of<_T>
{}; {};
template <typename _T>
struct signature_of<const volatile _T> : signature_of<_T>
{};
template <typename _T> template <typename _T>
struct signature_of<_T&> : signature_of<_T> struct signature_of<_T&> : signature_of<_T>
{}; {};
@ -337,9 +341,9 @@ namespace sdbus {
}; };
#endif #endif
template <typename _Enum> template <typename _Enum> // is_const_v and is_volatile_v to avoid ambiguity conflicts with const and volatile specializations of signature_of
struct signature_of<_Enum, typename std::enable_if_t<std::is_enum_v<_Enum>>> struct signature_of<_Enum, typename std::enable_if_t<std::is_enum_v<_Enum> && !std::is_const_v<_Enum> && !std::is_volatile_v<_Enum>>>
: public signature_of<std::underlying_type_t<_Enum>> : signature_of<std::underlying_type_t<_Enum>>
{}; {};
template <typename _Key, typename _Value, typename _Compare, typename _Allocator> template <typename _Key, typename _Value, typename _Compare, typename _Allocator>

View File

@ -93,17 +93,24 @@ struct sdbus::signature_of<std::list<_Element, _Allocator>>
{}; {};
namespace my { namespace my {
enum class Enum
{
Value1,
Value2
};
struct Struct struct Struct
{ {
int i; int i;
std::string s; std::string s;
std::list<double> l; std::list<double> l;
Enum e;
friend bool operator==(const Struct& lhs, const Struct& rhs) = default; friend bool operator==(const Struct& lhs, const Struct& rhs) = default;
}; };
} }
SDBUSCPP_REGISTER_STRUCT(my::Struct, i, s, l); SDBUSCPP_REGISTER_STRUCT(my::Struct, i, s, l, e);
/*-------------------------------------*/ /*-------------------------------------*/
/* -- TEST CASES -- */ /* -- TEST CASES -- */
@ -487,7 +494,7 @@ TEST(AMessage, CanCarryDBusStructGivenAsCustomType)
{ {
auto msg = sdbus::createPlainMessage(); auto msg = sdbus::createPlainMessage();
const my::Struct dataWritten{3545342, "hello"s, {3.14, 2.4568546}}; const my::Struct dataWritten{3545342, "hello"s, {3.14, 2.4568546}, my::Enum::Value2};
msg << dataWritten; msg << dataWritten;
msg.seal(); msg.seal();

View File

@ -102,6 +102,9 @@ namespace
TYPE(std::span<int16_t>)HAS_DBUS_TYPE_SIGNATURE("an") TYPE(std::span<int16_t>)HAS_DBUS_TYPE_SIGNATURE("an")
#endif #endif
TYPE(SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y") TYPE(SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y")
TYPE(const SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y")
TYPE(volatile SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y")
TYPE(const volatile SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y")
TYPE(SomeEnumStruct)HAS_DBUS_TYPE_SIGNATURE("x") TYPE(SomeEnumStruct)HAS_DBUS_TYPE_SIGNATURE("x")
TYPE(SomeClassicEnum)HAS_DBUS_TYPE_SIGNATURE("u") TYPE(SomeClassicEnum)HAS_DBUS_TYPE_SIGNATURE("u")
TYPE(std::map<int32_t, int64_t>)HAS_DBUS_TYPE_SIGNATURE("a{ix}") TYPE(std::map<int32_t, int64_t>)HAS_DBUS_TYPE_SIGNATURE("a{ix}")
@ -157,6 +160,9 @@ namespace
, std::span<int16_t> , std::span<int16_t>
#endif #endif
, SomeEnumClass , SomeEnumClass
, const SomeEnumClass
, volatile SomeEnumClass
, const volatile SomeEnumClass
, SomeEnumStruct , SomeEnumStruct
, SomeClassicEnum , SomeClassicEnum
, std::map<int32_t, int64_t> , std::map<int32_t, int64_t>