Доступ к подтипу класса через объект - PullRequest
0 голосов
/ 10 сентября 2018
class Foo{

public:
    struct Bar{};

};

...

Foo foo;

foo.Bar bar; //error

Мой компилятор сообщает о недопустимом использовании struct Foo::Bar. Здесь, конечно, я могу назвать подкласс Foo::Bar, если захочу, но если foo имеет очень длинный тип вложенного шаблона и / или был создан с помощью auto, тогда было бы удобно получить доступ к подтипам через такой объект.

* Редактировать: чтобы было ясно, я хочу создать объект типа Foo :: Bar, без необходимости писать Foo::.

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

[...], но если [F]oo имеет очень длинный тип вложенного шаблона [...]

ОК, при условии, что у вас есть:

class Foo
{
    template <typename T>
    class SomeVeryLongAndInconvenientName;
};

вы можете определить псевдоним для определенного типа:

using ShorterName = Foo::SomeVeryLongAndInconvenientName<SomeType>;

или как шаблон:

template <typename T>
using ShorterName = Foo::SomeVeryLongAndInconvenientName<T>;
0 голосов
/ 10 сентября 2018

Если у вас есть член struct Bar внутри class Foo, вы можете использовать decltype :

class Foo{
public:
    struct Bar{};
    Bar f_bar; 

};

Foo foo;
decltype(foo.f_bar) bar;
0 голосов
/ 10 сентября 2018

Следуя аналогичным предыдущим ответам, используя спецификатор decltype :

class Foo{

public:
    struct Bar{};

};

int main() {
    Foo foo;
    decltype(foo)::Bar bar;
    const Foor foofoo;
    decltype(foofoo)::Bar barbar;
}

Редактировать: включая решение для ссылок или указателей

#include <type_traits>
...

void fref(const Foo &foo) {
   typename std::remove_reference<decltype(foo)>::type::Bar bar;
}

void fpointer(Foo *foo) {
   typename std::remove_reference<decltype(*foo)>::type::Bar bar;
}
0 голосов
/ 10 сентября 2018

если foo имеет очень длинный тип вложенного шаблона и / или был создан с помощью auto, тогда было бы удобно получить доступ к подтипам через такой объект.

Вы можете использовать следующую стратегию.

  1. Объявить функцию-член, которая возвращает тип. Нет необходимости определять его, если только это не полезно.

  2. Используйте decltype, чтобы позволить компилятору получить тип из функции-члена.


Вот обновленная версия вашего опубликованного кода.

class Foo {

   public:
      struct Bar{};

      // Just the declaration is sufficient.
      Bar b() const;

};


int main()
{
   Foo foo;
   decltype(foo.b()) bar;
}
...