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

时间:2010-11-14 15:01:50

标签: c++ function alias

假设我有一个类似

的基本2D矢量类
class vector2
{
  int x, y;
}

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

我知道我可以让这两个函数内联,但编译器可能决定不内联这些函数。因此,如果getWidth刚刚调用getXpos,您最终会得到两个函数调用。

我想要使用它的一个更加相反的例子是getLength()和erm ... 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 个答案:

答案 0 :(得分:4)

  

但编译器可能决定不这样做   内联这些功能

然后编译器可能有充分的理由这样做。

我认为这是一个非问题,只需让替代名称的函数调用“真实”函数,编译器很可能会内联它。

编辑:

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

EDIT2:

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

答案 1 :(得分:1)

您引用的链接也是AFAIK而不是C功能,但是特定于该特定编译器的链接。

C ++提供了这样一种机制:它恰好是内联函数!担心编译器不能在内联函数中优化冗余调用肯定是过早的优化。内联,然后测量你是否担心性能。

如果您绝对坚持消除冗余呼叫的最小机会,您可能会对预处理器#define执行某些操作...但请注意:宏不遵守类边界,并且您的头文件会更快或者稍后踩到其他一些不相关的代码。最好不要去那里。

答案 2 :(得分:1)

看起来你并没有以面向对象的方式思考这个问题。我必须提出你真的不想这样做的mjfgates建议。

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

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

答案 3 :(得分:1)

使用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++?

答案 4 :(得分:0)

你可以使用预处理器#define ....如果你遇到了世界上最糟糕的错误。如果你愿意,你将获得相当于有保证的内联,或者如果你想要的话也可以获得别名。

答案 5 :(得分:-3)

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

不要这样做。

为相同的数据提供多条路径是听起来对于使用您的对象的任何人来说都很方便的事情之一 - 直到您想到它为止。接下来的六个月,有人在两个函数之一中出现了一个错误,你修复了那个函数而不是另一个函数,所以bug仍然存在。或者为你的对象编写客户端的程序员被半疯了,想知道getLength()和getSpan()之间有什么区别。

有一次我会这样做是在实现一个需要复制现有成员函数的接口时。在这种情况下,界面的功能将是虚拟的,因此内联的概念会消失。