繁体   English   中英

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

[英]Giving a function implementation more than one name in c++

假设我有一个基本的2D矢量类

class vector2
{
  int x, y;
}

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

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

我想要使​​用它的一个更加相反的例子是getLength()和erm ... getSpan() (当你说40“tv时,想到这里就像一个屏幕)

我会假设这将是一个类似于特殊函数定义的简单情况......我确实找到了这个页面,但这听起来像是一个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()方法,这样根据情况,相同的功能代码可以有不同的,更合适的名字。

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

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

我认为这是一个非常问题,只需将具有替代名称的函数称为“实际”函数,编译器很可能会内联它。

编辑:

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

EDIT2:

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

使用C ++ 11,您可以:

//works for non-template non-overloaded functions:

const auto& new_fn_name = old_fn_name;

其他解决方案: 如何在C ++中为函数名称分配别名?

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

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

如果你绝对坚持消除冗余调用的最小机会,你可能会对预处理器#define s做些什么......但要注意:宏不尊重类边界,你的头文件迟早会踩到其他的,不相关的代码。 最好不要去那里。

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

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

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

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

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

不要这样做。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM