Add SFINAE friendly for FindComponent

This commit is contained in:
sha512sum 2024-06-30 12:00:31 +00:00
parent 5dd7fe7903
commit b1c8927679

View file

@ -133,9 +133,15 @@ struct ServiceContextForComponent {
}; };
template <utempl::ConstexprString Name> template <utempl::ConstexprString Name>
constexpr auto FindComponent() -> decltype(FindComponent<kUtils.template GetIndexByName(Name)>()) { constexpr auto FindComponent() -> auto&
requires (Name == kBasicTaskProcessorName || requires {this->FindComponent<kUtils.template GetIndexByName(Name)>();}) {
if constexpr(Name == kBasicTaskProcessorName) {
return this->context.taskProcessor;
} else {
return this->FindComponent<kUtils.template GetIndexByName(Name)>(); return this->FindComponent<kUtils.template GetIndexByName(Name)>();
}; };
};
template <template <typename...> typename F> template <template <typename...> typename F>
constexpr auto FindComponent() -> decltype(this->FindComponent<kUtils.template GetFirstIndex<F>()>()) { constexpr auto FindComponent() -> decltype(this->FindComponent<kUtils.template GetFirstIndex<F>()>()) {
return this->FindComponent<kUtils.template GetFirstIndex<F>()>(); return this->FindComponent<kUtils.template GetFirstIndex<F>()>();
@ -258,14 +264,13 @@ struct ServiceContext {
template <typename Current, std::size_t I> template <typename Current, std::size_t I>
constexpr auto FindComponent() -> auto& requires (I == sizeof...(Ts) || requires{*Get<I>(this->storage);}) { constexpr auto FindComponent() -> decltype(*Get<I>(this->storage))& {
constexpr auto Index = kUtils.GetIndexByName(Current::kName); constexpr auto Index = kUtils.GetIndexByName(Current::kName);
if constexpr(I == sizeof...(Ts)) {
return this->taskProcessor;
} else {
constexpr utempl::ConstexprString name = Current::kName; constexpr utempl::ConstexprString name = Current::kName;
constexpr Options options = Current::kOptions; constexpr Options options = Current::kOptions;
constexpr auto dependencies = Get<Index>(DependencyGraph); constexpr auto dependencies = Get<Index>(DependencyGraph);
static_assert(( static_assert((
/* Component Type */ std::ignore = utempl::kType<typename Current::Type>, /* Component Type */ std::ignore = utempl::kType<typename Current::Type>,
/* Component Name */ std::ignore = name, /* Component Name */ std::ignore = name,
@ -274,7 +279,6 @@ struct ServiceContext {
return *Get<I>(this->storage); return *Get<I>(this->storage);
}; };
};
}; };