decltype, result_of ou typeof?
J'ai:
class A {
public:
B toCPD() const;
Et:
template<typename T>
class Ev {
public:
typedef result_of(T::toCPD()) D;
Après l'instanciation de Ev<A>
le compilateur dit:
meta.h:12: erreur: 'T::toCPD" n'est pas un type
ni decltype ni typeof travail.
source d'informationauteur Neil G
Vous devez vous connecter pour publier un commentaire.
Depuis n'importe quel résultat vous obtenez dépend du paramètre du modèle,
typedef typename
est nécessaire.decltype
est un standard C++11 fonctionnalité. C'est un "opérateur" qui prend une expression et renvoie un type.Si
T()
n'est pas valide (T
pas par défaut constructible), vous voulezdeclval
qui est une fonction qui prend un type et retourne un sens, une valeur non valide de ce type.declval
ne peut être utilisé dans des contextes non évaluée commedecltype
.Avant C++11,
decltype
était un non-extension standard de Microsoft MSVC compilateur. Son comportement peut avoir été légèrement modifiée par la normalisation.typeof
est GCC, l'équivalent de l'avant C++11 extension commedecltype
qui a également été cloné dans d'autres compilateurs. Ici est sa documentation de GCC. La page fournit pas de comparaison entre les caractéristiques, mais il note quetypeof
doit être appelée__typeof__
lors de l'utilisation d'un mode standard (-std=c++YY
vous devriez toujours faire), et il est disponible en C et C++.Pour le bien de C compatibilité,
__typeof__
ne permettra pas de résoudre un type de référence à partir d'un glvalue expression. Donc, c'est vraiment adapté pour C. Ce qui explique sans doute pourquoi le C++ fonctionnalité n'a pas hérité de la plus explicites nom: GNU n'était pas disposé à sacrifier la compatibilité descendante, alors que Microsoft se soucie moins de C et peut-être besoin de moins de changements.result_of
est un C++11 metafunction (déjà normalisé par l'ISO TR1 bibliothèque à partir de 2006). C'est un modèle qui prend un callable type (par exemple une fonctionint(void)
pointeur de fonctionint(*)(void)
foncteur de la classe de mise en œuvre deoperator()
ou un pointeur-à-membres de la fonction&T::toCPD
) et un argument de type liste de ce type, et fournit le type de retour si l'appel serait de travailler.À utiliser
result_of
avec un pointeur de fonction membre, vous devez inclure le parent type d'objet dans la liste d'arguments comme un substitut pourthis
.C'est très fragile, bien que, parce que
&T::toCPD
ne peut pas être résolu si il n'y a aucune surcharge, comme un non-const version. Cela est vrai en dépit du fait queT *
ouT const *
doit être explicitement écrit! Dans la plupart des cas, vous êtes mieux avecdecltype
etdeclval
.result_of n'est pas une fonction, ni un opérateur. result_of est un méta-fonction ayant une fonction comme modèle paramètre et le paramètre le type de résultat sur le type de membre