Reflection

di il
9 risposte

Reflection

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

  • Re: Reflection

    Ma per fare cosa?
  • Re: Reflection

    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
  • Re: Reflection

    Se si tratta di template, puoi usare static_assert e fare questi tipi di controlli.
    Per qualcosa di più sofisticato, puoi definire concepts e constraints, (richiede un compilatore e libreria standard C++ 20), oppure usare quelli predefiniti.
  • Re: Reflection

    Ecco, il problema è capire come definire i constraints personalizzati, non ho trovato nessuna indicazione in rete.
  • Re: Reflection

    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;
    }
    
  • Re: Reflection

    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.
  • Re: Reflection

    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.
  • Re: Reflection

    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.
  • Re: Reflection

    Certo, avevo preso in considerazione anche typeid, seppur limitato nell'uso
Devi accedere o registrarti per scrivere nel forum
9 risposte