在非成员函数中将嵌套名称引入作用域

Bring nested name into scope in non-member function

提问人:glades 提问时间:4/15/2022 最后编辑:user17732522glades 更新时间:4/15/2022 访问量:74

问:

我有一个结构 B,其中包含作为嵌套名称的类型声明。如何使用 -指令将范围引入另一个函数?我基本上想按原样访问类型而不限定它(就像从成员函数中一样)。我尝试了以下方法(见评论):anchor_pointanchor_pointusing

法典

#include <memory>
#include <iostream>

struct B
{
    struct anchor_point
    {
        int a_;
    };
    int x;
    int y;
};

int main()
{
    // Here's what I want - doesn't compile
    // using B;
    // anchor_point ap1{5};

    // This gets laborious if there are dozens of types inside of B
    B::anchor_point ap2{5};

    // This is even more laborious
    using ap_t = B::anchor_point;
    ap_t ap3{5};

    std::cout << ap2.a_ << ", " << ap3.a_ << "\n";
}

这个例子很愚蠢,但假设我在结构中声明了几十个这样的类型,我并不总是想输入,我该怎么做?B::type

C++ C++17 using 指令

评论

1赞 Klaus 4/15/2022
与其寻找更好的语法,不如开始考虑你的设计!对象的概念不是公开周围的所有东西,也不是从任何不相关的函数中访问嵌套结构深处的最后一点数据。如果您使用 c++17 标记但像汇编语言一样访问您的数据,那就完全不对劲了!
0赞 JHBonarius 4/15/2022
这是一个设计问题。如果你有一个嵌套类,那应该是有原因的,它不打算单独使用。如果 是 ,则 会有所不同,但由于它是 ,因此 是 或 应该 紧密耦合 。请注意,这是完全合法的(但令人困惑)。如果你认为这很“费力”,那么你就用错了语言编程。Bnamespaceclassanchor_pointBusing anchor_point = B::anchor_point;
1赞 Klaus 4/15/2022
@JHBonarius 如果你忽略任何给定语言的任何标准习语和标准做法,你会发现任何语言中的所有东西都是“费力的”:-)很明显,OP走错了路......希望这些评论是成为程序员并离开编码员世界的起点:-)

答:

2赞 user17732522 4/15/2022 #1

正如你所展示的,你可以做到

using anchor_point = B::anchor_point;

对每个相关成员重复。这必须在包含您要涵盖的成员的所有使用范围中仅出现一次。

没有其他方法,特别是没有等效的 for 命名空间,它使所有成员对非限定名称查找可见。using namespace