Определить:
template<typename ...> struct types;
Затем:
template <typename... Args> struct Entity {
struct Inner {
typedef types<Args...> entity_args_t;
};
struct SomeOtherInner {
typedef types<Args...> entity_args_t;
};
};
Затем вы можете передать entity_args_t
шаблону, который имеет частичную специализацию для types<T...>
.Если вы наберете Entity
, вы можете вместо этого написать частичную специализацию для Entity<T...>
, что может иметь больше смысла для вашего случая
template <typename... Args> struct Entity {
struct Inner {
// Equivalent: typedef Entity entity_args_t;
typedef Entity<Args...> entity_args_t;
};
struct SomeOtherInner {
typedef Entity<Args...> entity_args_t;
};
};
Таким образом, наличие typedef для entity_args_t
равно Entity<Args...>
,Вы можете написать это следующим образом (не проверено, но должно работать):
template<typename ProbablyInner, typename ProbablyEntity>
struct is_inner_impl : std::false_type
{ };
template<typename ProbablyInner, typename ...Args>
struct is_inner_impl<ProbablyInner, Entity<Args...>>
: std::is_same<
typename Entity<Args...>::Inner
ProbablyInner>
{ };
template<typename ProbablyInner, typename = std::true_type>
struct is_inner : std::false_type
{ };
template<typename ProbablyInner>
struct is_inner<ProbablyInner,
std::integral_constant<bool, is_inner_impl<
ProbablyInner,
typename ProbablyInner::entity_args_t>::value>>
: std::true_type
{ };