diff options
-rw-r--r-- | src/base/bitunion.hh | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/base/bitunion.hh b/src/base/bitunion.hh index 6e7d223d2..38d10dac3 100644 --- a/src/base/bitunion.hh +++ b/src/base/bitunion.hh @@ -55,26 +55,31 @@ class BitfieldTypeImpl : public Base "Bitfield base class must be empty."); private: - using Base::setter; - template<typename T> - struct TypeDeducer; + struct TypeDeducer + { + template<typename> + struct T; - template<typename T> - friend class TypeDeducer; + template<typename C, typename Type1, typename Type2> + struct T<void (C::*)(Type1 &, Type2)> + { + typedef Type1 Storage; + typedef Type2 Type; + }; - template<typename Type1, typename Type2> - struct TypeDeducer<void (Base::*)(Type1 &, Type2)> - { - typedef Type1 Storage; - typedef Type2 Type; + struct Wrapper : public Base + { + using Base::setter; + }; + + typedef typename T<decltype(&Wrapper::setter)>::Storage Storage; + typedef typename T<decltype(&Wrapper::setter)>::Type Type; }; protected: - typedef typename TypeDeducer< - decltype(&BitfieldTypeImpl<Base>::setter)>::Storage Storage; - typedef typename TypeDeducer< - decltype(&BitfieldTypeImpl<Base>::setter)>::Type Type; + typedef typename TypeDeducer::Storage Storage; + typedef typename TypeDeducer::Type Type; Type getter(const Storage &storage) const = delete; void setter(Storage &storage, Type val) = delete; |