@@ -177,9 +177,9 @@ class device_registrar
177177};
178178
179179
180- template <class DeviceClass , char const *ShortName, char const *FullName, char const *Source >
180+ template <class DeviceClass , typename Traits >
181181struct device_tag_struct { typedef DeviceClass type; };
182- template <class DriverClass , char const *ShortName, char const *FullName, char const *Source , device_flags::type Flags, device_feature::type Unemulated, device_feature::type Imperfect>
182+ template <class DriverClass , typename Traits , device_flags::type Flags, device_feature::type Unemulated, device_feature::type Imperfect>
183183struct driver_tag_struct { typedef DriverClass type; };
184184
185185class device_type_impl_base
@@ -238,13 +238,13 @@ class device_type_impl_base
238238 {
239239 }
240240
241- template <class DeviceClass , char const *ShortName, char const *FullName, char const *Source >
242- device_type_impl_base (device_tag_struct<DeviceClass, ShortName, FullName, Source >)
241+ template <class DeviceClass , typename Traits >
242+ device_type_impl_base (device_tag_struct<DeviceClass, Traits >)
243243 : m_creator(&create_device<DeviceClass>)
244244 , m_type(typeid (DeviceClass))
245- , m_shortname(ShortName )
246- , m_fullname(FullName )
247- , m_source(Source )
245+ , m_shortname(Traits::shortname )
246+ , m_fullname(Traits::fullname )
247+ , m_source(Traits::source )
248248 , m_emulation_flags(DeviceClass::emulation_flags())
249249 , m_unemulated_features(DeviceClass::unemulated_features())
250250 , m_imperfect_features(DeviceClass::imperfect_features())
@@ -253,13 +253,13 @@ class device_type_impl_base
253253 {
254254 }
255255
256- template <class DriverClass , char const *ShortName, char const *FullName, char const *Source , device_flags::type Flags, device_feature::type Unemulated, device_feature::type Imperfect>
257- device_type_impl_base (driver_tag_struct<DriverClass, ShortName, FullName, Source , Flags, Unemulated, Imperfect>)
256+ template <class DriverClass , typename Traits , device_flags::type Flags, device_feature::type Unemulated, device_feature::type Imperfect>
257+ device_type_impl_base (driver_tag_struct<DriverClass, Traits , Flags, Unemulated, Imperfect>)
258258 : m_creator(&create_driver<DriverClass>)
259259 , m_type(typeid (DriverClass))
260- , m_shortname(ShortName )
261- , m_fullname(FullName )
262- , m_source(Source )
260+ , m_shortname(Traits::shortname )
261+ , m_fullname(Traits::fullname )
262+ , m_source(Traits::source )
263263 , m_emulation_flags(DriverClass::emulation_flags() | Flags)
264264 , m_unemulated_features(DriverClass::unemulated_features() | Unemulated)
265265 , m_imperfect_features((DriverClass::imperfect_features() & ~Unemulated) | Imperfect)
@@ -400,10 +400,15 @@ extern emu::detail::device_registrar const registered_device_types;
400400// / DEFINE_DEVICE_TYPE_PRIVATE
401401#define DEFINE_DEVICE_TYPE (Type, Class, ShortName, FullName ) \
402402 namespace { \
403- struct Type ##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
404- constexpr char const Type##_device_traits::shortname[], Type##_device_traits::fullname[], Type##_device_traits::source[]; \
403+ struct Type ##_device_traits \
404+ { \
405+ static inline constexpr char const *const shortname = (ShortName); \
406+ static inline constexpr char const *const source = __FILE__; \
407+ static constexpr char const fullname[] = (FullName); \
408+ }; \
409+ constexpr decltype (Type##_device_traits::fullname) Type##_device_traits::fullname; \
405410 } \
406- emu::detail::device_type_impl<Class> const Type = emu::detail::device_tag_struct<Class, ( Type##_device_traits::shortname), (Type##_device_traits::fullname), (Type##_device_traits::source) >{ }; \
411+ emu::detail::device_type_impl<Class> const Type = emu::detail::device_tag_struct<Class, Type##_device_traits>{ }; \
407412 template class device_finder <Class, false >; \
408413 template class device_finder <Class, true >;
409414
@@ -437,10 +442,15 @@ extern emu::detail::device_registrar const registered_device_types;
437442#define DEFINE_DEVICE_TYPE_PRIVATE (Type, Base, Class, ShortName, FullName ) \
438443 namespace { \
439444 static_assert (std::is_convertible_v<Class &, Base &>, " Device implementation class must be convertible to exposed class." ); \
440- struct Type ##_device_traits { static constexpr char const shortname[] = ShortName, fullname[] = FullName, source[] = __FILE__; }; \
441- constexpr char const Type##_device_traits::shortname[], Type##_device_traits::fullname[], Type##_device_traits::source[]; \
445+ struct Type ##_device_traits \
446+ { \
447+ static inline constexpr char const *const shortname = (ShortName); \
448+ static inline constexpr char const *const source = __FILE__; \
449+ static constexpr char const fullname[] = (FullName); \
450+ }; \
451+ constexpr decltype (Type##_device_traits::fullname) Type##_device_traits::fullname; \
442452 } \
443- emu::detail::device_type_impl<Base> const Type = emu::detail::device_tag_struct<Class, ( Type##_device_traits::shortname), (Type##_device_traits::fullname), (Type##_device_traits::source) >{ };
453+ emu::detail::device_type_impl<Base> const Type = emu::detail::device_tag_struct<Class, Type##_device_traits>{ };
444454
445455// / \}
446456
0 commit comments