Est-ce que quelque chose comme ceci est possible? Ou est-ce que quelqu'un devrait pirater une structure return_type et la spécialiser pour chaque paire de types natifs?Déduire le type d'opérateur/la fonction pour les modèles
Répondre
Entendu de decltype
?
En C++0x
vous pouvez faire
template<class T, class U>
auto mul(T x, U y) -> decltype(x*y)
{
return x*y;
}
pré-C++ 0x
Je ne sais pas exactement ce que vous voulez accomplir, si:
template<typename T, typename U>
void my_mul(T t, U u, bool& overflow)
{
my_mul_impl(t*u, overflow);
}
template<typename TmultU>
void my_mul_impl(TmultU mult, bool& overflow)
{
//here you know the type and can do something meta-weird :)
if(mult > type_traits<TmultU>::max_allowed_in_my_cool_program())
overflow = true;
}
Il y a more
J'utilise Visual Studio 2008, donc j'ai dû trouver un moyen non C++ 0x. J'ai fini par faire quelque chose comme ça.
template<typename T> struct type_precedence { static const int value = -1; };
template< > struct type_precedence<long double> { static const int value = 0; };
template< > struct type_precedence<double> { static const int value = 1; };
template< > struct type_precedence<float> { static const int value = 2; };
template< > struct type_precedence<unsigned long long> { static const int value = 3; };
template< > struct type_precedence<long long> { static const int value = 4; };
template< > struct type_precedence<unsigned long> { static const int value = 5; };
template< > struct type_precedence<long> { static const int value = 6; };
template< > struct type_precedence<unsigned int> { static const int value = 7; };
template< > struct type_precedence<int> { static const int value = 8; };
template< > struct type_precedence<unsigned short> { static const int value = 9; };
template< > struct type_precedence<short> { static const int value = 10; };
template< > struct type_precedence<unsigned char> { static const int value = 11; };
template< > struct type_precedence<char> { static const int value = 12; };
template< > struct type_precedence<bool> { static const int value = 13; };
/////////////////////////////////////////////////////////////////////////////////////////
template<typename T, typename U, bool t_precedent = ((type_precedence<T>::value) <= (type_precedence<U>::value))>
struct precedent_type {
typedef T t;
};
template<typename T, typename U>
struct precedent_type<T,U,false> {
typedef U t;
};
/////////////////////////////////////////////////////////////////////////////////////////
template<typename T, typename U>
typename precedent_type<T,U>::t my_mul() { return T * U; }
EDIT: Voici l'exemple - Je le fais en fait pour multiplier les vecteurs. Il ressemble à ceci:
template<int N, typename T, typename U>
vec<N,typename precedent_type<T,U>::t> operator *(const vec<N,T>& v1,const vec<N,U>& v2) {
...
}
...
double3 = float3 * double3;
float4 = float4 * int4;
etc.
pourriez-vous donner un exemple de comment utiliser my_mul()? – Alsk
vous pourriez laisser le compilateur déduire le type de résultat en passant une variable pour stocker le résultat en référence à la fonction: 'mult (result_double3, float3, double3)'. Syntaxe pas pratique, mais gagner du temps sur le piratage de la main. – Alsk
Vous pouvez le faire non C++0x
code:
template<typename T, typename U> class Mul
{
T t_;
U u_;
public:
Mul(const T& t, const U& u): t_(t), u_(u) {}
template <class R>
operator R()
{
return t_ * u_;
}
};
template<typename T, typename U>
Mul<T, U> mul(const T& t, const U& u)
{
return Mul<T, U>(t, u);
}
Utilisation: omble chevalier t = 3; court u = 4; int r = mul (t, u);
Ici, nous avons deux types de déductions. Nous déclarons implicitement le type de retour par l'utilisation, pas exactement decltype (T * U)
- 1. Syntaxe pour les modèles de fonction spécialisés
- 2. Obtenir/déduire type dans la fonction de modèle pour la valeur de retour
- 3. Déduire le type à partir des génériques de la méthode
- 4. Déduire le type de retour d'une fonction ou d'un foncteur en C++
- 5. Pourquoi le compilateur ne peut-il pas déduire le type pour moi? (aka Smarter SmartEnumerable)
- 6. EF4 Builder.Configurations - Impossible de déduire une clé pour le type d'entité
- 7. Les modèles C++ peuvent-ils vérifier si une fonction a été surchargée pour un type donné?
- 8. EF POCO - Impossible de déduire une clé pour le type d'entité?
- 9. Type conditionnel dans les modèles C++?
- 10. Comment puis-je modifier les éléments et les modèles de contenu en fonction du type d'objet?
- 11. Comment déduire wsdl pour le service Web sous tomcat
- 12. interfaces pour les classes modèles
- 13. Ne peut pas déduire le type en C#, doivent fixer explicitement?
- 14. Pourquoi Delphi ne peut-il pas déduire le type d'un paramètre TEnumerable <T>?
- 15. Fonction ami et modèles
- 16. Quelle est la différence entre les modèles de fonction et les modèles de classe?
- 17. Pourquoi F # ne peut-il pas déduire le type de cette instruction?
- 18. Aide sur les modèles de modèles C++
- 19. Utiliser Zend_Autoloader pour les modèles
- 20. Modèles: Spécialisations de modèle de fonction: Déduction d'argument de modèle: -> quelqu'un peut-il donner d'autres exemples pour cette déclaration?
- 21. pluriel django pour les modèles
- 22. Modèles, pointeurs de fonction et C++ 0x
- 23. annotations de fonction python3 pour le type hinting contre Boo
- 24. Fonction SysUtils.StrScan() pour le type de chaîne? où?
- 25. Comment devrais-je en déduire quand le GC devrait fonctionner?
- 26. Implémenter la fonction Combiner en utilisant les modèles
- 27. Création d'une fonction qui fonctionne pour 2 modèles dans Rails
- 28. Déduire nombres de base de données Php
- 29. Comment faire pour déduire du temps en php?
- 30. C++ erreur, "n'a pas pu en déduire l'argument pour 'std ..."
Est-ce quelque chose comme ceci possible sans C++ 0x? – Chris
@Chris: Nopes! Cette fonctionnalité est disponible dans MSVC++ [2010] et dans g ++ (version 4.3 et supérieure). –
non, c'est l'une des raisons pour lesquelles les éléments "auto" et "decltype" ont été ajoutés pour remédier à cette lacune qui a causé des problèmes dans des domaines comme la programmation générique et la nécessité de deviner des types complexes comme les itérateurs de conteneurs. "typeof" existait chez certains compilateurs pour supporter cela mais il a maintenant été standardisé pour notre plaisir. – David