C 11 : Aliasing de fonction
En C , le mot-clé using peut être utilisé pour créer un alias pour une classe. Cependant, la même fonctionnalité n’est pas directement disponible pour les fonctions. Cet article explore la question de savoir si l'alias de fonction est possible et propose une solution utilisant le transfert parfait.
Objectif :
Déterminer s'il est possible de créer un alias pour une fonction dans C et, si tel est le cas, trouver la méthode la plus propre pour y parvenir.
Énoncé du problème :
Considérez ce qui suit code :
namespace bar
{
void f();
}
Nous aimerions créer un alias nommé g pour la fonction bar::f. Cependant, la tentative suivante génère une erreur :
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
Solution :
Pour créer un alias de fonction, nous pouvons utiliser une combinaison de modèles et un transfert parfait . Voici un exemple de la façon dont cela peut être réalisé :
template
auto g(Args&&... args) -> decltype(f(std::forward(args)...)) {
return f(std::forward(args)...);
}
Cette solution fonctionne en créant une fonction de modèle générique qui prend n'importe quel nombre d'arguments. Il transmet ensuite ces arguments à la fonction d'origine f en utilisant une transmission parfaite. Cela garantit que la fonction appelée reçoit les arguments dans leur forme d'origine, quelles que soient les conversions de type ou les déréférences de pointeur qui ont pu être appliquées à l'alias.
Remarque :
Cette solution fonctionne également pour les fonctions et les modèles de fonctions surchargés, garantissant que la fonction correcte est appelée en fonction des arguments fournis.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3