2010-09-30 4 views

Répondre

12

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; 
} 
+0

Est-ce quelque chose comme ceci possible sans C++ 0x? – Chris

+1

@Chris: Nopes! Cette fonctionnalité est disponible dans MSVC++ [2010] et dans g ++ (version 4.3 et supérieure). –

+0

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

0

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

2

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. 
+0

pourriez-vous donner un exemple de comment utiliser my_mul()? – Alsk

+0

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

8

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)

Questions connexes