Konvertierung von void* zu Template<T>
-
Hallo,
ich verwende eine C-API um Werte eines embedded device auszulesen, in etwa so:
int get_value(void* buf, size_t buf_size, int* val_type);Wobei
val_typebspw. sein kannVALUE_TYPE_STRING VALUE_TYPE_FLOAT VALUE_TYPE_INT //...und von der Funktion gesetzt wird.
Ich moechte nun eine Funktion schreiben, die die Konvertierung automatisch vornimmt, in etwa so:
template<ValType> bool get_value(ValType& res);Ich vergleiche mittels typeid ob
ValTypemit dem C-Datentyp kompatibel ist und falls ja, weise ichresden Wert zu.Der Nachteil ist nun, dass
- nur die Datentypen konvertiert werden koennen, die in der Abfrage if(typeid(...) = ...) auftauchen. Fuer alle anderen Template-Argumente macht die Funktion keinen Sinn.
- ueberhaupt typeid verwendet wird
Ich frage mich, ob man so etwas auch anders machen kann, und wenn ja, wie?
-
Mit Template-Spezialisierung (wenn du aus der Funktion ein struct machst) ließe sich bestimmt etwas machen, aber warum nicht einfach klassisch?

bool get_value(float& res); bool get_value(int& res);
-
Überladungen sind hier definitiv besser. Templates würden dir nur helfen, wenn die den Rückgabetyp "überladen" möchtest:
template <typename T> struct always_false { static const bool value = false; }; template <typename T> T get_value() { static_assert(always_false<T>::value, "..."); } template <> int get_value<int>(); template <> float get_value<float>();
-
cooky451 schrieb:
Templates würden dir nur helfen, wenn die den Rückgabetyp "überladen" möchtest
Das waere noch praktischer. Ich muss dem Aufrufer nur mitteilen, ob die Konvertierung geklappt hat oder nicht.
Wozu ist dieses Konstrukt gut? (oder war das nur ein Beispiel?)
template <typename T> struct always_false { static const bool value = false; }; static_assert(always_false<T>::value, "...");
-
Das ist ein Trick, um dem User eine schoene Fehlermeldung geben zu koennen, wenn er versucht, das Template mit einem nicht unterstuetzten Typen zu instanzieren. Da das static_assert aber bereits bei der Definition triggern wuerde, wenn die Bedingung nicht vom Template-Parameter abhaengt, behilft cooky sich hier always_false, das diese Abhaengikeit herstellt.
-
ernie++ schrieb:
cooky451 schrieb:
Templates würden dir nur helfen, wenn die den Rückgabetyp "überladen" möchtest
Das waere noch praktischer. Ich muss dem Aufrufer nur mitteilen, ob die Konvertierung geklappt hat oder nicht.
Nun, das könnte man mit Exceptions machen. Ist halt die Frage: Ist es erwartet dass das mal schief geht? Würde die Ausführung dann normal weiter gehen? Dann lass es so wie es ist. Ist es nicht erwartet, und werden später sehr wahrscheinlich große Teile des Codes übersprungen, wenn der Aufruf fehlschlägt? Dann nimm Templates und Exceptions. Wenn's ne Bibliothek ist in der beides der Fall sein kann, kannst du auch beides anbieten.