Reflection

di oleg il
9 risposte
Buonasera a tutti. Volevo chiedervi se conoscete qualche modo per ottenere il reflection in c++ dato che non è nativamente supportato. Magari esiste qualche libreria oppure c'è una tecncica per implementarlo?

9 Risposte

  • Ma per fare cosa?
  • Beh, mi è capitato molte volte la necessità di conoscere il tipo di un dato per fare dei controlli, ma ho sempre aggirato il problema in un altro modo. So che altri linguaggi come c# hanno questa funzionalità. Per esempio, se ho una specifica necessità per un template che deve poter essere uitlizzato per certi tipi, non presenti in quelli base, ho bisogno di un meccanismo che "riconosca" ul tipo di dato e se corrisponde a quelli compatibili col template, lo utilizza, altriementi notifica un errore
  • Ecco, il problema è capire come definire i constraints personalizzati, non ho trovato nessuna indicazione in rete.
  • Ma non ti basta static_assert?
    
    #include <iostream>
    #include <type_traits>
    using namespace std;
    
    template <class T> T Moltiplica (T a, T b) {
      static_assert(is_same<T,int>::value || is_same<T,float>::value);
      return a * b;
    }
    
    int main () {
      int i1 = 1, i2 = 2, i3 = Moltiplica (i1, i2);
      cout << i3 << endl;
      float f1 = 3.0, f2 = 4.0, f3 = Moltiplica (f1, f2);
      cout << f3 << endl;  
      // ASSERT FAIL
      //double d1 = 5.0, d2 = 6.0, d3 = Moltiplica (d1, d2);
      //cout << d3 << endl;   
      return 0;
    }
    
  • La questione e' ""spinosa""

    1) C++ ha un "microscopico" supporto per il reflection, basato sul "RTTI" (Runtime Type Information) che serve SOLO per fare il "casting" di una classe da un tipo ad un'altro (quando il casting NON E' banale)

    2) FORSE introduranno il supporto al reflection in C++23
    https en.cppreference.com/w/cpp/keyword/reflexpr
    3) per i "constraint" nei template, altra "rogna rognosa", ci sono i "concept"
    https en.cppreference.com/w/cpp/language/constraints
    ma che comunque possono essere ""simulati"" usando la "template programming"



    4) con un po' di pazienza, trovi delle librerie che implementano la "reflection" in modo non eccessivamente orrendo
    (cerca "reflection")

    5) in ""teoria"" un set completo di informazioni per implementare il reflection le trovi nelle informazioni di "debug". Il problema e' che trovare la documentazione su ""COME"" tali informazioni sono salvate e' davvero complicato.
  • Bene, proverò a vedere tra le librerie che hai linakto, in attesa che venga introdotta nel c++ e che il buon Stroustrup si decida ad aggiornare la bibbia alle nuove versioni. Mi procurerò anche quei libri sui template, visto che è un argomento abbstanza vasto.
  • Se devi fare controlli sui tipi dei template (cioè sul codice sorgente) il C++ è abbastanza fornito già adesso, ma non ha a che vedere con la reflection.
    La reflection riguarda analisi e modifiche a runtime sul programma. Qualcosa puoi farlo usando l'istruzione typeid per riconoscere i tipi.
  • Certo, avevo preso in considerazione anche typeid, seppur limitato nell'uso
Devi accedere o registrarti per scrivere nel forum
9 risposte