代码之家  ›  专栏  ›  技术社区  ›  thecoshman

在c中为函数实现指定多个名称++

  •  5
  • thecoshman  · 技术社区  · 14 年前

    假设我有一个基本的二维向量类

    class vector2
    {
      int x, y;
    }
    

    这两个值可以用来表示位置以及宽度和高度。C++是否为我提供了一个函数,比如 vector2::getXpos() 然后定义 vector2::getWidth() 并让它使用相同的实现。

    我知道我可以使这两个函数都内联,但是编译器可能决定不内联这些函数。所以如果 getWidth 刚刚打电话来 getXpos 最后会有两个函数调用。

    我想用它来做的一个更具宗教色彩的例子是 getLength() 呃。。。 getSpan() (当你说40“电视时,想到这里就像一个屏幕)

    我假设这是一个简单的例子,类似于一个特殊的函数定义。。。我确实发现 this page 但这听起来像是一个C特性。。。为了工作还需要一点技巧。

    编辑

    我不是在问内联函数的机制。。。我基本上想做一些功能上类似的事情

    class MyClass
    {
      void ActaullyDoStuff();
      public:
      void foo(){ActaullyDoStuff();}
      void bar(){ActuallyDoStuff();}
    }
    

    但是在那里我可以写一些

    class MyBetterClass
    {
      public:
      void foo(){ /* BLOCK OF CODE */ }
      void bar(){ /* DO WHAT EVER foo() DOES */ }
    }
    

    我想要 bar() 作为另一种方式 foo() 因此,同一个功能代码可以根据不同的情况使用不同的、更合适的名称。

    6 回复  |  直到 14 年前
        1
  •  1
  •   user208608user208608    14 年前

    看来你不是以面向对象的方式来考虑这个问题。我不得不同意你不想这么做的建议。

    您要做的是将向量的概念抽象到一个类中,并实现可能要与向量一起使用的常用方法。实际上,您可能希望考虑将上面的类示例实现为“Point”类,然后让“Vector”类聚合两个Point类。

    使用您的示例,如果您的类用于两个不同的目的,那么它将不会得到很好的定义。假设你想在某个类上建立一个方法来绘制矢量2。您必须知道vector2的哪些实例表示起点,哪些实例表示宽度/高度。您可能还需要第三个表示来表示方向。更简单的方法是根据getStartPoint、getEndPoint和任何其他方法来实现向量,这些方法将执行适合于向量的计算。然后消费者不需要知道vector2类的内部工作,他们只需要调用方法来获取所需的信息。

        2
  •  4
  •   ronag    14 年前

    但是编译器可能决定不 内联这些函数

    那么编译器可能有很好的理由这样做。

    我认为这是一个没有问题的问题,只要让具有替代名称的函数调用“real”函数,编译器就很可能将其内联。

    编辑:

    如果这不能说服你,你可以用 __forceinline 在visual studio中。 Here 是在GCC中强制内联的方法。

    编辑2:

    class MyBetterClass
    {
      public:
      void foo(){ /* BLOCK OF CODE */ }
      __forceinline void bar(){ foo(); /* DO WHAT EVER foo() DOES */ }
    }
    
        3
  •  1
  •   Pontus Gagge    14 年前

    您引用的链接也是AFAIK,它也不是C特性,而是特定于特定编译器的特性。

    C++提供了这样一种机制:它恰好是内联函数!担心编译器没有优化掉可内联函数中的冗余调用绝对是过早的优化。内联,然后衡量你是否担心性能。

    如果您绝对坚持要消除冗余调用的最小机会,那么您可以使用预处理器 #define s、 。。。但是要注意:宏不尊重类的边界,而且头文件迟早会踩到其他不相关的代码上。最好不要去那儿。

        4
  •  1
  •   Community    7 年前

    使用C++ 11可以做到:

    //works for non-template non-overloaded functions:
    
    const auto& new_fn_name = old_fn_name;
    

    其他解决方案: How do I assign an alias to a function name in C++?

        5
  •  0
  •   rtpg    14 年前

    你可以使用预处理器 #define s、 。。。。如果你是世界上最坏的虫子。如果你想的话,你会得到保证内联的等价物,如果你想的话,也可以得到别名。

        6
  •  -3
  •   mjfgates    14 年前

    因此,您希望在同一对象上有两个函数,它们返回的数据与同一数据类型完全相同。

    别那么做。

    为同一个数据提供多条路径是一个听起来可能对任何人使用你的对象都很方便的事情——直到你考虑它。接下来的六个月,有人在这两个函数中的一个中发现了一个bug,而你修复了那个函数,但没有修复另一个,所以bug仍然存在。或者为你的对象编写客户端的程序员有点发疯,想知道getLength()和getSpan()之间有什么区别。

    我要做的一件事就是实现一个需要重复现有成员函数的接口。在这种情况下,接口的函数将是虚拟的,因此内联的概念将消失在窗口之外。