diff --git a/Hypodermic/AsSelf.h b/Hypodermic/AsSelf.h index 5e8d0a2..5cc6a64 100644 --- a/Hypodermic/AsSelf.h +++ b/Hypodermic/AsSelf.h @@ -7,12 +7,38 @@ namespace Hypodermic { namespace RegistrationDescriptorOperations { + + namespace Details + { + + struct InstanceRegistrationNotResolvable {}; + struct InstanceRegistrationResolvable {}; + + template + struct GetInstanceRegistrationResolvability + { + private: + typedef typename TDescriptorInfo::RegisteredBases RegisteredBases; + typedef typename TDescriptorInfo::InstanceRegistrationTag InstanceRegistrationTag; + + public: + typedef typename std::conditional + < + (RegisteredBases::count == 0) || std::is_same< InstanceRegistrationTag, Tags::SelfRegistered >::value, + InstanceRegistrationResolvable, + InstanceRegistrationNotResolvable + > + ::type Type; + }; + + } // namespace Details + template < class TDescriptor, class TDescriptorInfo, - class TInstanceRegistrationTag = typename TDescriptorInfo::InstanceRegistrationTag + class TInstanceRegistrationResolvability = typename Details::GetInstanceRegistrationResolvability< TDescriptorInfo >::Type > class AsSelf; @@ -22,7 +48,7 @@ namespace RegistrationDescriptorOperations class TDescriptor, class TDescriptorInfo > - class AsSelf< TDescriptor, TDescriptorInfo, Tags::NotSelfRegistered > + class AsSelf< TDescriptor, TDescriptorInfo, Details::InstanceRegistrationNotResolvable > { public: // This template avoids Early Template Instantiation issue @@ -52,7 +78,7 @@ namespace RegistrationDescriptorOperations class TDescriptor, class TDescriptorInfo > - class AsSelf< TDescriptor, TDescriptorInfo, Tags::SelfRegistered > + class AsSelf< TDescriptor, TDescriptorInfo, Details::InstanceRegistrationResolvable > { protected: virtual ~AsSelf() {}