2017-03-13 3 views
0

Ich habe eine Funktion, die im Moment einen Wert eines bestimmten Typs für mich zurückgeben kann. Es sieht aus wie diesesTemplateed Funktion Rückgabetyp zur Kompilierzeit keine Argumente

template<typename T> 
T getNullValue(){ 
    if(std::is_same<T,long long>::value){ 
     return NULL_LONG; 
    }else if(std::is_same<T,double>::value){ 
     return NULL_DOUBLE; 
    } 

} 

Dies funktioniert, aber ich mag es nicht zur Laufzeit der Lösung im Gegensatz Zeit zu kompilieren, aber dies ermöglicht es mir

double x = getNullValue<double>(); 
long long y = getNullValue<long long>(); 

zu tun Wie kann ich es machen, so dass ich kann Überlasten Sie einfach verschiedene Versionen von getNullValue, je nachdem, was ich zurückgeben möchte, ohne dass dies zur Laufzeit gelöst werden muss.

getNullValue<type i need>(); 
+0

Bitte beachten Sie, dass dieser Code optimal ist, wenn er mit Optimierung kompiliert wird. Sie können zwar das Überladen der "eleganten" Vorlage vornehmen, aber es macht den Code komplizierter, als er sein sollte. –

+0

Die einfache Antwort ist 'wenn conexpr' und nichts anderes muss sich ändern. – chris

+0

sagst du, wenn ich "wenn consxpr (std :: is_same ....)" dann wird es zur Kompilierzeit aufgelöst? – flips

Antwort

1

Template Spezialisierung sollte schön den Trick. Ein optimierender Compiler sollte in eine einfache Zuweisung umwandeln.

// getNullValue.hpp : 

template <class T> 
T getNullValue() { 
    return 0; 
} 

// remember to declare specialization in header or strange linking errors may occur 
template <> long long getNullValue<long long>() 
template <> double getNullValue<double>() 


// getNullValue.cpp: 

template <> long long getNullValue<long long>() { 
    return NULL_LONG; 
} 
template <> double getNullValue<double>() { 
    return NULL_DOUBLE; 
} 

int main() { 
    double x = getNullValue<double>(); 
    long long y = getNullValue<long long>(); 
} 

Weitere Beispiele für Spezialisierungen finden Sie unter http://en.cppreference.com/w/cpp/language/template_specialization.

+0

Danke das ist genau das, was ich brauchte! – flips

Verwandte Themen