class Foo{
public:
struct Bar{};
};
...
Foo foo;
foo.Bar bar; //error
Мой компилятор говорит недопустимое использование struct Foo::Bar
, Здесь, конечно, я могу назвать подкласс Foo::Bar
если я хочу, но если foo
имеет очень длинный тип вложенного шаблона и / или был создан с помощью auto, тогда было бы удобно получать доступ к подтипам через такой объект.
* Edit: чтобы было ясно, я хочу создать объект типа Foo :: Bar, без необходимости писать Foo::
,
Следуя аналогичным предыдущим ответам, используя спецификатор 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;
}
[…] но если [F]oo
имеет очень длинный тип вложенного шаблона […]
ОК, если у вас есть:
class Foo
{
template <typename T>
class SomeVeryLongAndInconvenientName;
};
Вы можете определить псевдоним для, либо с определенным типом:
using ShorterName = Foo::SomeVeryLongAndInconvenientName<SomeType>;
или как шаблон:
template <typename T>
using ShorterName = Foo::SomeVeryLongAndInconvenientName<T>;
Если у вас есть член struct Bar
внутри class Foo
, ты можешь использовать decltype:
class Foo{
public:
struct Bar{};
Bar f_bar;
};
Foo foo;
decltype(foo.f_bar) bar;
если
foo
имеет очень длинный тип вложенного шаблона и / или был создан с помощью auto, тогда было бы удобно получать доступ к подтипам через такой объект.
Вы можете использовать следующую стратегию.
Объявите функцию-член, которая возвращает тип. Нет необходимости определять его, если только это не полезно.
использование decltype
чтобы компилятор получил тип из функции-члена.
Вот обновленная версия вашего размещенного кода.
class Foo {
public:
struct Bar{};
// Just the declaration is sufficient.
Bar b() const;
};int main()
{
Foo foo;
decltype(foo.b()) bar;
}