У меня есть такой код

class A : public b<T>
{
public:
    typedef b<T> _baseclass; // why we need this declaration 
};

Какая польза от typedef внутри класса? Ограничено ли определение только этим классом? Должны ли мы создать его как статический и использовать без создания объекта класса?

-4
Nagappa 1 Мар 2018 в 19:19

1 ответ

Лучший ответ

Этот тип члена также будет доступен вне определения класса, что удобно в коде шаблона. Если вы передали A в шаблон функции или, может быть, в некоторые другие классы, которые также имеют типы членов _baseclass, то вы можете использовать _baseclass, чтобы узнать, что такое основа, без необходимости знать именно такой тип верхнего уровня.

Стандартные шаблоны, такие как std::vector и std::map, имеют типы членов, такие как value_type - они не обозначают базовый класс, но имеют аналогичную цель, поскольку вы можете использовать value_type в любом месте контейнера. используется независимо от того, какой контейнер.

Меняем местами typedef на using (потому что я хочу), вот пример:

// The class templates

template <typename T>
struct Base {};

struct A : Base<int>
{
    using base_class = Base<int>;
};

struct B : Base<char>
{
    using base_class = Base<char>;
};

struct C : Base<bool>
{
    using base_class = Base<bool>;
};


// The example

template <typename T>
void foo()
{
    // typename needed because base_class is a "dependent name"
    // (just go with it)
    typename T::base_class the_base;

    // This line is to suppress "unused variable" warnings
    (void)the_base;
}

int main()
{
   foo<A>();
   foo<B>();
   foo<C>();
}

Хотя эта конкретная программа на самом деле ничего не «делает», она показывает шаблон функции foo, который может «знать», каким был базовый класс в каждом случае, без какой-либо дополнительной информации о том, что именно представляет собой T. . И это будет работать для любого класса, в который вы добавили тип члена base_class!

2
Lightness Races in Orbit 1 Мар 2018 в 19:36