通过对象访问类的子类型

时间:2018-09-10 05:08:55

标签: c++ class c++17 subtype

class Foo{

public:
    struct Bar{};

};

...

Foo foo;

foo.Bar bar; //error

我的编译器说无效使用struct Foo::Bar。当然,如果愿意,我可以在这里命名子类Foo::Bar,但是如果foo具有很长的嵌套模板类型和/或由auto创建,那么通过这样的对象访问子类型会很方便

*编辑:为清楚起见,我想创建一个Foo :: Bar类型的对象,而不必编写Foo::

4 个答案:

答案 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创建,则通过这样的对象访问子类型将很方便。

您可以使用以下策略。

  1. 声明一个返回该类型的成员函数。除非有其他用途,否则无需对其进行定义。

  2. 使用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;