En C , SFINAE (Substitution Failure Is Not An Error) vous permet de activer ou désactiver le code en fonction du type d'argument de modèle. Cependant, lorsqu'il s'agit de fonctions membres d'un modèle de classe, SFINAE ne fonctionne souvent pas comme prévu.
Voici un exemple qui illustre le problème :
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
Dans cet exemple, Foo définit deux fonctions membres surchargées bar(). La première surcharge est activée lorsque T est A et la seconde est activée lorsque T est B. Cependant, si vous essayez de compiler ce code, vous recevrez un message d'erreur indiquant que les surcharges ne peuvent pas être résolues.
La raison de cette erreur est que SFINAE ne fonctionne que pour les arguments de modèle déduits. Dans le cas des fonctions membres d'un modèle de classe, l'argument du modèle n'est pas déduit mais plutôt spécifié explicitement. Pour résoudre le problème, vous pouvez utiliser l'une des techniques suivantes :
Utiliser des arguments de modèle explicites :
struct Foo
{
void bar(A) {}
void bar(B) {}
};
Utilisez std::enable_if dans les fonctions membres :
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
Utiliser la spécialisation de modèle de classe explicite :
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
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