J'essaye d'écrire une fonction C++ mex pour Matlab qui peut gérer plusieurs types de données. Matlab me donne un mxArray*
, à partir de laquelle je peux récupérer un void*
pour les données, et un mxClassID
me disant le type de données. Donc, je peux faire quelque chose comme:C++ décode bien le pointeur vide pour Matlab mex
void *data = mxGetData(mxarray);
switch (mxGetClassID(mxarray)) {
case mxDOUBLE_CLASS:
my_function(static_cast<double *>(data));
...
my_function
est basé sur un modèle, donc ce poignées différentes types de données bien. Mais il est toujours très ennuyeux d'avoir besoin de ce commutateur pour tous les my_function1
, my_function2
Jusqu'ici, la solution que j'ai trouvée est d'utiliser une approche fonctionnelle et d'avoir une méthode qui accepte un foncteur:
template <typename ReturnType, typename FunctorType>
ReturnType mxarr_apply(const mxArray *inarr, FunctorType functor) {
void *data = mxGetData(inarr);
switch (mxGetClassID(inarr)) {
case mxDOUBLE_CLASS:
return (ReturnType) functor(static_cast<double *>(data));
...
de cette façon, je peux mettre ma logique dans le foncteur (avec operator()
templated) et ne pas avoir à recréer le basculement et plus. Mais je me demande s'il existe d'autres moyens? En Java, je pense que je pourrais juste avoir une fonction qui convertit le mxClassID
directement en une référence class
qui pourrait ensuite être utilisée pour instancier un type de manière flexible à l'exécution, mais cela ne semble pas être une option en C++.
+1 .. et de préférence au maximum une fois – stijn
Merci beaucoup. Et pour écrire le commutateur une seule fois, l'approche du foncteur est la voie à suivre? Ou y a-t-il d'autres options? Cette configuration devient particulièrement pénible lorsqu'il s'agit de sortie. Je trouve que je suis limité à la production basée sur les effets secondaires pour de nombreuses situations. – Chinasaur