Доступ ко члену-типу шаблонного типа извне шаблонного типа
Скажите, пожалуйста, как Стандарт C++ регламентирует доступ ко вложенному члену-типу шаблонного типа при условии, что вложенный член-тип не зависит от шаблонных параметров объемлющего типа?
Например:
template <typename X>
class Type
{
public:
class SubType
{
};
};
using Alias = typename Type::SubType;// How can I do that?
То есть, возможно ли получить доступ к Type::SubType извне Type без указания параметров шаблона? Если да, то как это сделать? Если нет, то почему?
Ответы (1 шт):
Type<X> - будет отдельным типом для каждого X. Поэтому, Type<X>::SubType - тоже отдельный независимый тип.
Стандарт ника не предоставляет возможности проверить, зависит ли вложенный тип от шаблонного параметра. (Предполагается, что всегда зависит.) Даже если такой зависимости де-факто нет, все равно эти типы имеют разные имена, а std::is_same должен возвращать false.
static_assert( std::is_same_v< Type<int>::SubType, Type<void>::SubType> == false );
Можно либо сделать шаблонный алиас:
template <typename X>
using Alias = typename Type<X>::SubType;
Либо объявить SubType отдельно:
class Type_SubType
{
};
template <typename X>
class Type
{
public:
using SubType = Type_SubType;
};
static_assert( std::is_same_v< Type<int>::SubType, Type<void>::SubType> == true );