Il est facile de créer un nouveau nom pour un type, une variable ou un espace de noms. Mais comment attribuer un nouveau nom à une fonction? Par exemple, je souhaite utiliser le nom holler
de 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(); }
void (&NewName)(some_vector&, float, float, float, float) = OldName;
lors de mon prochain enregistrement.printf
ici. Ce n'était qu'un exemple. Le problème ici a plus à voir avec les limitations de l'anglais qu'autre chose. J'ai une seule fonction au service du but A et du but B, mais je suis tout simplement incapable de trouver un seul nom servant les deux buts ici.T &a = b;
crée un nouveau nom pourb
.typedef
pour les types etnamespace A=B;
pour les espaces de noms.using BaseClass::BaseClassMethod
, et il y ausing AliasType = Type;
, et il y a mêmenamespace AliasNamespace = Namespace;
. Ce qu'il nous manque, c'estusing AliasFunction = Function;
Réponses:
Il existe différentes approches:
Avec C ++ 11 avec des fonctions non surchargées non-template, vous pouvez simplement utiliser:
Si cette fonction a plusieurs surcharges, vous devez utiliser
static_cast
:Exemple: il y a deux surcharges de fonction
std::stoi
Si vous souhaitez créer un alias vers la première version, vous devez utiliser ce qui suit:
Remarque: il n'y a aucun moyen de créer un alias pour une fonction surchargée de sorte que toutes ses versions surchargées fonctionnent, vous devez donc toujours spécifier la surcharge de fonction exacte que vous souhaitez.
Avec C ++ 14, vous pouvez aller encore plus loin avec
constexpr
les variables de modèle. Cela vous permet d'aliaser des fonctions basées sur des modèles:De plus, à partir de C ++ 11, vous avez une fonction appelée
std::mem_fn
qui permet d'aliaser les fonctions membres. Consultez l'exemple suivant:la source
constexpr
approche des variables de modèle: l'alias ne peut pas faire de déduction de type. Le compilateur me demande de fournir une liste de paramètres de modèle (j'écris une fonction de modèle variadique): ne peut pas faire référence au modèle de variable `alias_to_old 'sans liste d'arguments de modèleconstexpr auto new_fn_name = old_fn_name
fonctionne en C ++ 11 (au moins dans gcc 4.9.2) et vaut mieux que placer&
. Il ne nécessite pas que l'appel soit toujours effectué via un pointeur et permet ainsi à la fonction d'être intégrée à la place de l'appel.constexpr auto holler = [] ( auto &&...args ) { return printf( std::forward<decltype(args)>( args )... ); };
std::mem_fn
n'est pas un alias car elle fait beaucoup plus de magie derrière le sens.Vous pouvez créer un pointeur de fonction ou une référence de fonction:
la source
fn
, en utilisant l'alias? Pouvez-vous expliquer le pointeur de fonction et la référence de la fonction? Comment sont-ils différents? Sont-ils les mêmes ici?r();
void (&r)() = this->fn;
Ça devrait vous convenir.
la source
decltype
comme il a été introduit dans c ++ 11. De plus, cela devrait également fonctionner avec la bonne vieille plaine C.int (*holler)(const char*, ...) = std::printf;
la source
Utilisez un wrapper en ligne. Vous obtenez les deux API, mais gardez l'implémentation unique.
la source
Depuis fluentcpp : ALIAS_TEMPLATE_FUNCTION (f, g)
la source
Avec les lambdas génériques C ++ 14, j'ai pu effectuer les opérations suivantes, ce qui devrait également fonctionner lorsque la fonction cible a plusieurs surcharges:
la source
Il convient de mentionner ici IMO que, bien que la question originale (et les bonnes réponses) soient certainement utiles si vous souhaitez renommer une fonction (il y a de bonnes raisons de le faire!), Si tout ce que vous voulez faire est de supprimer un espace de noms profond mais gardez le nom, il y a le
using
mot - clé pour cela:Cela a également l'avantage d'être confiné à une étendue, bien que vous puissiez toujours l'utiliser au niveau supérieur d'un fichier. J'utilise souvent ceci pour
cout
etendl
donc je n'ai pas besoin de mettre TOUTstd
avec le classiqueusing namespace std;
en haut d'un fichier, mais aussi utile si vous utilisez quelque chose commestd::this_thread::sleep_for()
beaucoup dans un fichier ou une fonction, mais pas partout, et pas d'autres fonctions de l'espace de noms. Comme toujours, il est déconseillé de l'utiliser dans des fichiers .h, sinon vous polluerez l'espace de noms global.Ce n'est pas la même chose que le "renommage" ci-dessus, mais c'est souvent ce que l'on souhaite vraiment.
la source