Доступ ко члену-типу шаблонного типа извне шаблонного типа

Скажите, пожалуйста, как Стандарт C++ регламентирует доступ ко вложенному члену-типу шаблонного типа при условии, что вложенный член-тип не зависит от шаблонных параметров объемлющего типа?

Например:

template <typename X>
class Type
{
    public:
    class SubType
    {
    };
};

using Alias = typename Type::SubType;// How can I do that?

То есть, возможно ли получить доступ к Type::SubType извне Type без указания параметров шаблона? Если да, то как это сделать? Если нет, то почему?


Ответы (1 шт):

Автор решения: Chorkov

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 );
→ Ссылка