2015-09-23 5 views
5

Ich muss im Grunde die gleiche Funktion implementieren, aber für andere Größe. Genauer gesagt ist es so etwas wie ...C++ Elegante Möglichkeit, die Zuweisung unterschiedlicher Typen mit einer Methode und ohne Warnung zu implementieren?

type& operator=(unsigned int); 
type& operator=(unsigned long int); 
type& operator=(unsigned long long int); 
type& operator=(int); 
type& operator=(long int); 
type& operator=(long long int); 
type& operator=(short int); 
//so on and so forth... 

Sie haben genau das gleiche zu tun ... (außer i Konto in der unterschiedlichen Größe nehmen sollte), würde die Hauptidee „, wenn die Art der breiteste ist verwende den Code für die Aufgabe ... ansonsten führe einen Casting aus und führe den Code aus ". Ist es möglich, all diesen repetitiven Code mit nur einer Methode zu vermeiden? (Ich möchte nicht, dass der Compiler mir eine Warnung gibt, wenn ich kompiliere ...).

Danke

+0

Zuordnung von primitivem Integer-Typ ist aus verschiedenen Gründen problematisch, aber wenn Sie es tun müssen: Haben Sie versucht, die Umsetzung nur die Überlastungen für 'intmax_t 'und' uintmax_t' (aus '')? – pmdj

+0

Ja, ich benutze CSTDINT, ich möchte nur vermeiden, den gleichen Code zu schreiben ... in eleganter und effizienter Weise. – user8469759

Antwort

6

Diese für alle ganzzahligen Typen funktionieren:

template< 
    typename T, 
    typename = std::enable_if_t<std::is_integral<T>::value> 
> 
type& operator= (T); 

Wenn Sie auf Größe abhängen wollen, kann es mit einfach sizeof(T) erhalten werden. Sie können das mit Ihrer größten gewünschten Größe vergleichen.

Wenn Sie zwei separate Funktionen haben möchten, müssen Sie auch diese Klausel einfügen und eine Art von statisch-all verwenden.

+0

Gibt es eine Alternative zu Vorlagen? Sie sind ziemlich schwer zu lesen. – user8469759

+0

@Lukkio Entschuldigung, aber was finden Sie in diesem speziellen Code schwer zu lesen? Ich denke, es ist ziemlich einfach. –

+0

@TartanLlama oder verdammt, richtig. –

6

Neben die answer of Bartek Banachewicz eine alternative Art und Weise, es zu lösen:

struct type 
{ 
    ////Solution by Bartek Banachewicz 
    //template<typename T,typename = typename std::enable_if<std::is_integral<T>::value>::type> 
    //type& operator= (T) 
    //{ 
    // return *this; 
    //} 

    template<typename T> 
    auto operator=(T) -> typename std::enable_if<std::is_integral<T>::value, type>::type& 
    { 
     return *this; 
    } 
}; 
+1

Ich fühle, dass dieser Link http://StackOverflow.com/A/22515589/1614219 für diejenigen nützlich sein könnte, die (wie ich), nicht wissen, über die '->' Syntax in Signaturen. – dureuill

+0

Diese Antwort ist besser, weil sie mehrere Überladungen 'std :: enable_if' erlaubt (Sie können das Standardfunktionsvorlagenargument nicht ändern) – TemplateRex

Verwandte Themen