C++ 在c+中为函数实现提供多个名称+;
假设我有一个基本的2D向量类,比如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
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()
和ermgetSpan()
(当你说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()
?