class Foo{
public:
struct Bar{};
};
...
Foo foo;
foo.Bar bar; //error
我的编译器说无效使用struct Foo::Bar
。当然,如果愿意,我可以在这里命名子类Foo::Bar
,但是如果foo
具有很长的嵌套模板类型和/或由auto创建,那么通过这样的对象访问子类型会很方便
*编辑:为清楚起见,我想创建一个Foo :: Bar类型的对象,而不必编写Foo::
。
答案 0 :(得分:2)
使用decltype specifier遵循类似的先前答复:
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;
}
答案 1 :(得分:1)
[...],但是如果
[F]oo
具有非常长的嵌套模板类型[...]
好的,假设您已经:
class Foo
{
template <typename T>
class SomeVeryLongAndInconvenientName;
};
您可以使用以下特定类型为其定义别名:
using ShorterName = Foo::SomeVeryLongAndInconvenientName<SomeType>;
或作为模板:
template <typename T>
using ShorterName = Foo::SomeVeryLongAndInconvenientName<T>;
答案 2 :(得分:0)
如果
foo
具有很长的嵌套模板类型和/或由auto创建,则通过这样的对象访问子类型将很方便。
您可以使用以下策略。
声明一个返回该类型的成员函数。除非有其他用途,否则无需对其进行定义。
使用decltype
让编译器从成员函数中派生类型。
这是您发布的代码的更新版本。
class Foo {
public:
struct Bar{};
// Just the declaration is sufficient.
Bar b() const;
};
int main()
{
Foo foo;
decltype(foo.b()) bar;
}
答案 3 :(得分:0)
如果您在struct Bar
中有class Foo
的成员,则可以使用decltype:
class Foo{
public:
struct Bar{};
Bar f_bar;
};
Foo foo;
decltype(foo.f_bar) bar;