C++ 在c+中为函数实现提供多个名称+;

C++ 在c+中为函数实现提供多个名称+;,c++,function,alias,C++,Function,Alias,假设我有一个基本的2D向量类,比如 class vector2 { int x, y; } class MyBetterClass { public: void foo(){ /* BLOCK OF CODE */ } void bar(){ /* DO WHAT EVER foo() DOES */ } } 这两个值可用于表示位置以及宽度和高度。C++是否提供了一个我用来实现一个函数的函数,例如 VCARTUR2::GETXPOSH()/CUT>,然后还定义了 VECRTR

假设我有一个基本的2D向量类,比如

class vector2
{
  int x, y;
}
class MyBetterClass
{
  public:
  void foo(){ /* BLOCK OF CODE */ }
  void bar(){ /* DO WHAT EVER foo() DOES */ }
}
这两个值可用于表示位置以及宽度和高度。C++是否提供了一个我用来实现一个函数的函数,例如<代码> VCARTUR2::GETXPOSH()/CUT>,然后还定义了<代码> VECRTR2::GETWIWHOTH()/CUT>,并使用了相同的实现。 我知道我可以将这两个函数内联,但编译器可能会决定不内联这些函数。因此,如果刚刚调用了
getWidth
,您将得到两个函数调用

我想使用它的一个更真实的例子是
getLength()
和erm
getSpan()
(当你说40英寸电视时,这里就像一个屏幕)

我会假设这是一个类似于特殊函数定义的简单例子…我确实发现了,但这听起来像是一个C特性…而且有点难以使用

编辑


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

class MyClass
{
  void ActaullyDoStuff();
  public:
  void foo(){ActaullyDoStuff();}
  void bar(){ActuallyDoStuff();}
}
但是在那里我可以写下这样的东西

class vector2
{
  int x, y;
}
class MyBetterClass
{
  public:
  void foo(){ /* BLOCK OF CODE */ }
  void bar(){ /* DO WHAT EVER foo() DOES */ }
}

我希望
bar()
成为执行
foo()
的另一种方式,以便相同的函数代码可以根据情况使用不同的、更合适的名称。

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

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

如果你绝对坚持要消除最少量的冗余调用,你可以使用预处理器
#define
s做一些事情……但是要注意:宏不尊重类边界,你的头文件迟早会踩到其他不相关的代码。最好不要去那里

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

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

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

编辑:

如果这不能说服您,那么可以在VisualStudio中使用。 是在GCC中强制内联的方法

编辑2:

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

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

不要那样做

为同一数据提供多条路径,这听起来似乎对使用您的对象的任何人都很方便,直到您仔细考虑。接下来的六个月,有人在两个函数中的一个函数中发现了一个错误,您修复了该函数,但没有修复另一个,因此该错误的sti或者为您的对象编写客户机的程序员疯狂地想知道getLength()和getSpan()之间的区别是什么


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

如果你遇到了世界上最严重的bug,你可以使用预处理器
#define
。你会得到如果你愿意,就相当于保证内联,如果你也愿意,就只使用别名。

看来你没有以面向对象的方式考虑这个问题。我不得不附和mjfgates的建议,你真的不想这样做

你想做的是把向量的概念抽象到一个类中,并实现你可能想要用向量的常用方法。事实上,你可能想把上面的类实例作为一个“点”类来实现,然后有一个“vector”类聚合两个点类。


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

使用C++11您可以执行以下操作:

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

const auto& new_fn_name = old_fn_name;
其他解决办法:

你确定要在位置和尺寸上使用相同的类型,仅仅因为它们在结构上是相同的吗?听起来不是个好主意。我会定义两种不同的类型。这使客户机代码的意图更加清晰。“我不是问内联函数的机制。。。“,也许不是。。。但是内联函数做你想做的…除了我想只写一次函数,给它多个名字,然后调用它。因此,如果
foo
有一个bug,并且它被修复了,因为
bar
是同一个函数,所以它被修复了,从而曲解了这个问题,作为一种实践提供了非顺序的建议。别忘了#define inline'd是调试的痛苦@瑞斯特文斯:的确。我几乎不能推荐它,但它是一种可能的,如果更复杂的方式,可以实现内联函数更优雅的功能。如果你真的想在不存在的地方增加明显的复杂性(多个成员函数名),这应该作为一种方法实现吗?i、 新的名称实际上是
MyClass::doStuff()