2017-01-11 4 views
7

Ich habe eine Funktion:Disallow implizite Konvertierungen in Funktionsaufruf in int

void foo(int n) { 
    std::cout << "foo(int)\n"; 
} 

die verschiedenen Argumenten aufgerufen werden kann, kann es char, double, float usw. sein .:

foo(123); // 1 
foo('c'); // 2 
foo(0.2); // 3 
foo(0.2f); // 4 
// ... 

. .. aber ich möchte nur int Argumente (Literal oder Variable) erlauben, so dass 2,3,4, ... oben wäre illegal. Meine aktuelle Lösung ist, diese Überlastungen mit löschen:

void foo(char) = delete; 
void foo(float) = delete; 
void foo(double) = delete; 

aber diese Liste von Überlastungen sein kann wirklich lang, und immer kann jemand eine Klasse schreiben, die implizit in int umwandeln, was meine int erlauben wird, nur verwenden Funktion in falsche Art und Weise, so dass ich das Schreiben (statt lange explizite Liste) gefunden:

funktioniert wie erwartet.

Gibt es Nachteile bei der Verwendung der Vorlage wie oben? Oder gibt es vielleicht bessere Möglichkeiten, dieses Problem zu lösen?

+1

Was mit nicht (wirklich) 'int' Parameter _wrong_ ist? Wenn die Werte außerhalb des Bereichs Ihrer Funktion liegen, sollten Sie Ausnahmen "werfen". – edmz

+1

@ AlgirdasPreidžius Der einzige Unterschied besteht darin, dass diese Frage im Grunde nach möglichen Nachteilen für die Antwort in dieser Frage fragt. – BoBTFish

+0

Auch wenn diese Frage gut geschrieben ist, zeigt sie keinen Forschungsversuch, da die Suche nach dem genauen Titel mehrere Fragen zum selben Thema zeigt. –

Antwort

2

Sie können static_assert mit std::is_same verwenden:

template<typename T> 
void foo(T i) { 
    static_assert(std::is_same<T, int>::value, "Not int"); 
    std::cout << "foo(int)\n"; 
} 
Verwandte Themen