C++ 将方法和字段带入外部范围,无需显式引用

Posted

技术标签:

【中文标题】C++ 将方法和字段带入外部范围,无需显式引用【英文标题】:C++ bring methods and fields into external scope, without explicit references 【发布时间】:2019-11-09 19:12:16 【问题描述】:

我想要一种类似于闭包隐式执行的行为,将变量带入作用域,而无需显式声明引用

示例结构

struct A
    T x;
    void g();
;

行为效果,真实但不受欢迎的语法

void f()
    A a;
    T& x= a.x;
    void(A::*g)()= &A::g; //method pointer; obvious why this is undesirable
    //...
;

所需的、不受支持的语法

void f()
    A a;
    using a;
    //invalid/unsupported use of keyword

void f()
    A a;
    [&a]
        //...
        //lambdas only bring members into scope for keyword this
    ();

【问题讨论】:

你想用这个来完成什么?你基本上没有封装,我看不到人们试图这样做。 FWIW,对于类成员变量,您可以使用 structured binding 以更容易获取别名。 它只是节省了大量的打字工作。我使用数据导向,所以封装对我来说不是问题。 结构化绑定很接近,但我希望绑定与其引用具有相同的名称,因此键入 auto& [x,g]= ax, &a:: G ;此外,它不能为每个类成员自动绑定。 【参考方案1】:

这既不是令人满意的解决方案,也不是对读者友好的解决方案。显式声明引用比这样做要好得多。 但是,它只需要将变量显式地带入范围一次。 wrangler 的方法用作范围块。

struct wrangler
    T& a;
    void(A::*g)()= &A::g;
    void f()
        //...
    

【讨论】:

以上是关于C++ 将方法和字段带入外部范围,无需显式引用的主要内容,如果未能解决你的问题,请参考以下文章

将外部 Javascript 与在全局(窗口)范围内定义方法隔离开来

C++入门篇之引用,内联函数,auto和范围遍历

_variant_t 范围指针的 C++ 文字自动化问题(AddPicture() 方法)

您如何检查子查询记录是不是在范围外部字段中?

有没有办法将 require_once() 的范围显式设置为全局?

在子选择中创建聚合,而无需将引用的字段添加到分组列表