Доступ к подтипу класса через объект

class Foo{

public:
struct Bar{};

};

...

Foo foo;

foo.Bar bar; //error

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

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

0

Решение

Следуя аналогичным предыдущим ответам, используя спецификатор 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;
}
2

Другие решения

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

ОК, если у вас есть:

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

Вы можете определить псевдоним для, либо с определенным типом:

using ShorterName = Foo::SomeVeryLongAndInconvenientName<SomeType>;

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

template <typename T>
using ShorterName = Foo::SomeVeryLongAndInconvenientName<T>;
1

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

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

};

Foo foo;
decltype(foo.f_bar) bar;
0

если 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;
}
0
По вопросам рекламы [email protected]