Donner à une implémentation de fonction plus d’un nom en c ++

Disons que j’ai une classe de vecteur 2D de base quelque chose comme

class vector2 { int x, y; } 

ces deux valeurs pourraient être utilisées pour représenter une position ainsi qu’une largeur et une hauteur. C ++ me permet-il d’implémenter une fonction telle que vector2::getXpos() , puis de définir vector2::getWidth() et de le faire utiliser la même implémentation.

Je sais que je pourrais simplement créer ces deux fonctions en ligne, mais le compilateur pourrait décider de ne pas les intégrer. Donc, si getWidth vient d’appeler getXpos vous obtiendrez deux appels de fonction.

Un exemple plus réaliste de ce pour quoi je voudrais utiliser ceci est getLength() et erm … getSpan() (en getSpan() comme un écran ici pour quand vous dites 40 “tv)

Je suppose que ce serait un cas simple de quelque chose comme une définition de fonction spéciale … J’ai trouvé cette page, mais cela ressemble à une fonctionnalité C … et un peu de bidon pour fonctionner.

MODIFIER

Je ne parle pas de la mécanique des fonctions en ligne … Je veux fondamentalement faire quelque chose fonctionnellement comme

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

mais où je peux juste écrire quelque chose comme

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

Je veux que bar() soit un autre moyen de faire foo() sorte que le même code fonctionnel puisse avoir des noms différents, plus appropriés, en fonction de la situation.

Il semble que vous ne pensiez pas à cela de manière orientée object. Je dois appuyer le conseil de Mjfgates selon lequel vous ne voulez vraiment pas faire cela.

Ce que vous voulez faire, c’est résumer l’idée d’un vecteur dans une classe et implémenter les méthodes courantes que vous pouvez utiliser avec un vecteur. En fait, vous voudrez peut-être envisager d’implémenter votre exemple de classe ci-dessus en tant que classe “Point”, puis une classe “Vector” agrégeant deux classes de points.

En utilisant votre exemple, votre classe ne serait pas bien définie si elle était utilisée à deux fins différentes. Supposons que vous souhaitiez créer une méthode sur une classe pour dessiner le vecteur2. Vous devez savoir quelles instances de vector2 représentent un sharepoint départ et lesquelles représentent une largeur / hauteur. Vous auriez probablement aussi besoin d’une troisième représentation pour représenter la direction. Le moyen le plus simple consiste à implémenter le vecteur en termes de getStartPoint, getEndPoint et de toute autre méthode permettant d’effectuer des calculs appropriés pour le vecteur. Ensuite, le consommateur n’a pas besoin de connaître le fonctionnement interne de la classe vector2, il appelle simplement les méthodes pour obtenir les informations dont il a besoin.

mais le compilateur pourrait décider de ne pas intégrer ces fonctions

Ensuite, le compilateur a probablement une bonne raison de le faire.

Je pense que ceci n’est pas un problème, il suffit que la fonction avec le nom alternatif appelle la fonction “réelle”, et le compilateur la mettra probablement en ligne.

MODIFIER:

Si cela ne vous a pas convaincu, il est possible d’utiliser __forceinline dans Visual Studio. Voici le moyen de forcer inline dans GCC.

EDIT2:

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

Votre lien référencé est AFAIK pas une fonctionnalité C non plus, mais quelque chose de spécifique à ce compilateur particulier.

C ++ fournit un tel mécanisme: il se trouve que ce sont des fonctions en ligne! S’inquiéter du fait que le compilateur n’optimise pas l’appel redondant dans une fonction insérable est certainement une optimisation prématurée. En ligne, mesurez si vous êtes préoccupé par les performances.

Si vous tenez absolument à éliminer la moindre chance d’un appel redondant, vous pouvez faire quelque chose avec le pré-processeur #define s … , code non associé. Mieux vaut ne pas y aller.

En utilisant C ++ 11, vous pourriez faire:

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

Autres solutions: Comment atsortingbuer un alias à un nom de fonction en C ++?

vous pouvez utiliser le pré-processeur #define s … si vous êtes dans le pire bogue du monde. Vous obtiendrez l’équivalent d’une garantie en ligne si vous le souhaitez ou simplement d’un pseudonyme si vous le souhaitez également.

Donc, vous voulez avoir deux fonctions, sur le même object, qui retournent exactement les mêmes données, sous le même type de données.

Ne fais pas ça.

Fournir plus d’un chemin d’access aux mêmes données fait partie des choses qui semblent convenir à quiconque utilisera votre object, jusqu’à ce que vous y réfléchissiez. Ce qui se passe, c’est que six mois plus tard, quelqu’un trouve un bogue dans l’une des deux fonctions et que vous corrigez cette fonction mais pas l’autre, le bogue existe toujours. Ou bien le programmeur qui écrit des clients pour votre object est à moitié fou en se demandant quelle est la différence entre getLength () et getSpan ().

La seule fois où je le ferais serait lors de la mise en œuvre d’une interface nécessitant un duplicata d’une fonction membre existante. Dans ce cas, la fonction de l’interface sera virtuelle et la notion d’inline disparaît.