Comment puis-je attribuer un alias pour un nom de fonction en C++?
Il est facile de créer un nouveau nom pour un type, d'une variable ou d'un espace de noms. Mais comment puis-je attribuer un nouveau nom à une fonction? Par exemple, je veux utiliser le nom holler
pour printf
. #define est évident... d'une autre manière?
Solutions:
#define holler printf
void (*p)() = fn; //function pointer
void (&r)() = fn; //function reference
inline void g(){ f(); }
- Merci à vous tous. Mes collègues vont l'aimer voir
void (&NewName)(some_vector&, float, float, float, float) = OldName;
dans mon prochain enregistrement. - pas autant qu'ils vont aimer vous voir utiliser des noms aléatoires pour les fonctions de bibliothèque standard.
- Je ne suis pas déconner avec
printf
ici. C'était seulement un exemple. Le problème ici n'a plus à faire avec les limitations de l'anglais qu'autre chose. J'ai une seule fonction de servir Un but et de l'objet B, mais je suis tout simplement incapable de trouver un nom unique servant à la fois ici. - Exactement comment voulez-vous créer un alias pour une variable? Sauf que tu veux dire une référence ou un pointeur.
- précisément.
T &a = b;
crée un nouveau nom pourb
.typedef
pour les types et lesnamespace A=B;
pour les espaces de noms. - Un non-évident moment avec la fonction des références et pointeurs: si vous définissez l'en-tête, ils doivent être déclarés comme
static
ouextern
(avec la définition correspondante dans le fichier source dans le dernier cas) - sinon, vous pouvez obtenir de multiples "définition" de l'erreur. Mentionné à propos de ce seulement parce que nous discutons des alias (généralement, ils peuvent être utilisés dans les en-têtes) dans cette question. - Il est
using BaseClass::BaseClassMethod
, et il n'y ausing AliasType = Type;
, et il en est de mêmenamespace AliasNamespace = Namespace;
. Ce qui nous manque estusing AliasFunction = Function;
Vous devez vous connecter pour publier un commentaire.
Il existe différentes approches:
Avec C++11 avec les non-modèle non-surcharge de fonctions, vous pouvez simplement utiliser:
Si cette fonction a plusieurs surcharges vous devez utiliser
static_cast
:Exemple: il y a deux surcharges de la fonction
std::stoi
Si vous voulez faire un alias pour la première version, vous devez utiliser la syntaxe suivante:
Remarque: il n'y a pas moyen d'en faire un alias pour fonction surchargée de telle manière que toutes ses versions surchargées de travail, donc vous devez toujours spécifier la fonction exacte de la surcharge que vous voulez.
Avec C++14, vous pouvez aller encore plus loin avec
constexpr
les variables de modèle. Qui vous permet de alias basées sur des modèles de fonctions:En outre, à partir de C++11, vous avez une fonction appelée
std::mem_fn
qui permet d'attribuer des fonctions membres. Voir l'exemple suivant:constexpr
les variables de modèle d'approche: l'alias ne peut pas faire de ce type de déduction. Le compilateur m'oblige à fournir un modèle de la liste des paramètres (je suis en train d'écrire un variadic template de fonction): ne peut pas faire référence à la variable de template `alias_to_old " sans un modèle de liste d'argumentsconstexpr auto new_fn_name = old_fn_name
fonctionne en C++11 (au moins dans gcc 4.9.2) et c'est mieux que de placer&
. Il ne nécessite pas d'appel à la toujours fait au travers de l'aiguille et permet ainsi la fonction inline dans le lieu de l'appel.constexpr auto holler = [] ( auto &&...args ) { return printf( std::forward<decltype(args)>( args )... ); };
std::mem_fn
est pas un alias depuis, il effectue beaucoup plus de magie derrière le sens.Vous pouvez créer un pointeur de fonction ou une fonction de référence:
fn
, à l'aide de l'alias? Pouvez-vous expliquer pointeur de fonction & la fonction de référence? Comment sont-ils différents? Sont-ils la même chose ici?r();
void (&r)() = this->fn;
Devrait vous faire bien.
decltype
comme il a été présenté en c++11. En outre, ce devrait également travailler avec la bonne vieille plaine C.int (*holler)(const char*, ...) = std::printf;
Utiliser une ligne de wrapper. Vous obtenez les deux Api, mais de garder la seule mise en œuvre.
De fluentcpp : ALIAS_TEMPLATE_FUNCTION(f, g)
Il est intéressant de mentionner ici l'OMI que si la question d'origine (et de grandes réponses) est certainement utile si vous souhaitez renommer une fonction (il y a de bonnes raisons de le faire!), si tout ce que vous voulez faire est de sortir la bande d'une profondeur de l'espace de noms mais garder le nom, il est le
using
de mots clés pour ce:Cela a aussi l'avantage d'être confiné à une portée, même si vous pouvez toujours l'utiliser au plus haut niveau d'un fichier. J'utilise souvent cette pour
cout
etendl
je n'ai pas besoin d'apporter dans TOUSstd
avec le classiqueusing namespace std;
au sommet d'un fichier, mais aussi utile si vous utilisez quelque chose commestd::this_thread::sleep_for()
beaucoup dans un fichier ou d'une fonction, mais pas partout, et pas les autres fonctions de l'espace de noms. Comme toujours, il est déconseillé de l'utiliser .h fichiers, ou vous allez polluer l'espace de noms global.Ce n'est pas le même que le "renommage" ci-dessus, mais c'est souvent ce qui est vraiment voulu.