代码之家  ›  专栏  ›  技术社区  ›  void.pointer

C++中“扩展方法”的标准化建议在哪里?

c++
  •  5
  • void.pointer  · 技术社区  · 6 年前

    我忘记了一年前(也许更久)我看到的提案中使用的确切术语。它看起来类似于C#扩展方法,因为定义为类接口一部分的全局函数可以使用类成员语法调用。非常非常简单的示例:

    class Foo
    {
    public:
        void One();
    };
    
    void Two(Foo&);
    
    int main()
    {
        Foo f;
        f.One();
        f.Two(); // This was valid in the proposal I saw
    }
    

    我确信我的代码示例与此相差甚远,但我更多地是使用它来交流我记得看到的特性。我是完全偏离了这一点,还是有人建议C++引入这种机制?如果是这样的话,有人能给我指出该提案以及它的状态/时间表吗?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Severin Pappadeux    6 年前

    有一种针对C++的统一(var-Uniform)调用语法的建议。从10000英尺的PoV开始,它将允许扩展方法a la C#,并真正混合了给定对象的方法调用和函数调用之间的差异。

    以下是此功能的简短描述

    https://isocpp.org/blog/2016/02/a-bit-of-background-for-the-unified-call-proposal

    据我所知,它没有进入C++17(为时已晚?),等待c++2x

        2
  •  4
  •   jbcoe    6 年前

    Roger Orr和我在2015年的这篇论文中提议将扩展方法添加到C++(17):

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0079r0.pdf

    (语言)进化小组不相信这是他们渴望追求的方向。

    我认为C#中的扩展方法是一个很好的特性,但这似乎并不是一个公认的真理。

    我不打算再次提出C++20的建议。

    简要总结

    (根据einpoklum的要求)

    统一调用语法建议使用自由函数语法调用成员函数:

    void foo(const A& a);
    class B { void foo(); };
    
    A a;
    foo(a); // calls foo(const A&);
    
    B b;
    foo(b); // calls b.foo();
    

    扩展方法建议使用成员函数语法调用适当编写的自由函数:

    void foo(const A& this); // note the name `this` is important
    class B { void foo(); };
    
    A a;
    a.foo(); // calls foo(const A&);
    
    B b;
    b.foo(); // calls b.foo();