Bonjour,
dans le cadre d'un petit outil pour le binding Js <=> C++, je voudrais écrire une fonction template pour convertir différents types natif depuis et vers JS.
J'ai donc un template par défaut défini comme suit (1):
Je spécialise ensuite ce template pour différents types de base (int, string, ...). Les paramètres d'entrées restent identique (JsObj) ; seul celui de retou diffère. Par exemple (2):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename TYPE> TYPE JsToNative(JsObj object) { throw new Exception("unhandled JsToNative conversion."); }
Mon problème est que je voudrais maintenant définir une spécialisation 'générique' qui s'applique pour tout TYPE qui soit un pointeur vers une instance de classe. Quelque chose comme (3):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template<> std::string JsToNative(JsObj object) { if (object.isJsString()) return std::string(object.toString()); else throw new Exception("bad JsToNative conversion: JS object is not a string."); }
Problème: cette dernière implémentation (et les autres variantes testées) ne fonctionnent pas quand j'essaie de lui passer un pointeur ( JsToNative<MonType*>(myJsObj) ) : soit le compilo essaie d'utiliser (1) à la place de (3), soit j'ai un "call of overloaded template function is ambiguous".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 template<> TYPE* JsToNative(JsObj object) { if (object->isJsObject()) { TYPE* ptr = dynamic_cast<TYPE*>( object->getBoundDataPointer() ); if (ptr) return ptr; } throw new Exception("bad JsToNative conversion: JS object is not bound to a native instance."); }
Une idée ?
Merci d'avance
Partager