Biblioteki atrybutów i odbić dla C++?

Większość dojrzałych projektów C++ wydaje się mieć własny system odbić i atrybutów, czyli do definiowania atrybutów, które mogą być dostępne przez ciąg znaków i są automatycznie serializowalne. Co najmniej wiele projektów C++, w których brałem udział wydawało się odkrywać Koło .

Czy znasz jakieś dobre biblioteki open source dla C++, które obsługują kontenery refleksyjne i atrybutowe, a konkretnie:

  • Definiowanie RTTI i atrybutów za pomocą makr
  • dostęp RTTI i atrybuty za pomocą kodu
  • Automatyczna serializacja atrybutów
  • nasłuchiwanie modyfikacji atrybutów (np. OnValueChanged)
Author: Fabian, 2008-09-18

8 answers

Możesz rzucić okiem na dwa narzędzia poniżej. Nigdy nie używałem żadnego z nich, więc nie mogę powiedzieć, jak (im)praktyczne są.

XRTTI:

Xrtti jest narzędziem i biblioteką towarzyszącą C++, która rozszerza standardowy system typu runtime C++, aby zapewnić znacznie bogatszy zestaw informacji o klasach i metodach manipulowania tymi klasami i ich członkami.

OpenC++:

Openc++ to nakładka C++ library (lexer+parser+DOM / MOP) oraz source-to-source translator. Openc++ umożliwia tworzenie narzędzi języka C++, rozszerzeń, optymalizacji kompilatorów specyficznych dla domeny oraz protokołów metaobject runtime.

 5
Author: Carl Seleborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 06:33:19

Oto, co dostajesz, gdy C++ spotyka się z refleksją:

C++ meets Reflection

Cokolwiek wybierzesz, prawdopodobnie będzie miał straszne makra, trudny do debugowania kod lub dziwne kroki budowania. Widziałem, jak jeden system automatycznie generuje kod serializacji z pliku PDB DevStudio.

Poważnie, w przypadku małych projektów łatwiej będzie pisać funkcje zapisu/ładowania (lub używać operatorów strumieniowych). W rzeczywistości, to może trzymać się dużych projektów zbyt - to oczywiste, co się dzieje i zwykle trzeba zmienić kod, jeśli struktura się zmieni.

 11
Author: Skizz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 14:14:00

Powstał nowy projekt zapewniający refleksję w C++ przy użyciu zupełnie innego podejścia: CAMP . https://github.com/tegesoft/camp

CAMP nie używa precompilera, klasy / właściwości / funkcje/... są deklarowane ręcznie przy użyciu składni podobnej do boost.python lub luabind. Oczywiście, ludzie mogą użyć prekompilera takiego jak gccxml lub open-c++ do wygenerowania tej deklaracji, jeśli wolą.

Jest oparty na czystym C++ i tylko nagłówkach boost, a dzięki mocy meta-programowanie szablonów obsługuje wszelkiego rodzaju bindowalne encje(dziedziczenie i dziwne konstruktory nie stanowią problemu, na przykład).

Jest rozpowszechniany na licencji MIT (wcześniej LGPL).

 11
Author: Laurent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 21:16:51

Patrzyłem na te rzeczy przez jakiś czas, ale wydają się być bardzo ciężkie. Mogą one uniemożliwić korzystanie z dziedziczenia lub posiadania dziwnych konstruktorów itp. Ostatecznie okazało się, że są zbyt dużym obciążeniem, a nie wygodą.

To podejście do wystawiania członków, których teraz używam, jest dość lekkie i pozwala na zbadanie klasy do serializacji lub ustawiania wszystkich pól o nazwie " x " na 0, Na przykład. Jest również statycznie określony, więc jest bardzo szybki. Brak warstw kodu biblioteki lub code-gen, aby martwić się o bałagan w procesie budowania. Uogólnia się do hierarchii typów zagnieżdżonych.

Ustaw swój edytor za pomocą makr, aby zautomatyzować pisanie niektórych z tych rzeczy.

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}
 4
Author: Matthew Herrmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-21 05:09:21

/ Align = "left" / Obecnie najprostszym rozwiązaniem wydaje się BOOST_FUSION_ADAPT_STRUCT. Praktycznie po utworzeniu biblioteki / nagłówka wystarczy dodać swoje pola struct do makra BOOST_FUSION_ADAPT_STRUCT (), ponieważ ostatni segment kodu pokazuje . Tak, ma ograniczenia wiele innych osób wspomniało. I nie obsługuje bezpośrednio słuchaczy.

Inne obiecujące rozwiązania, które przyjrzałem się to

  • CAMP i XRTTI / gccxml, jednak oba wydają się być przeszkodą w wprowadzeniu zależności od zewnętrznych narzędzi do projektu.
  • lata temu używałem Perla c2ph/pstruct aby zrzucić meta info z wyjścia gcc -gstabs, jest to mniej inwazyjne, ale wymaga więcej pracy, chociaż działało idealnie dla mnie.

Jeśli chodzi o podejście boost/__cxa, po ustaleniu wszystkich drobnych szczegółów dodawanie/zmiana struktur lub pól jest proste w utrzymaniu. obecnie używamy go do budowy warstwy wiążącej typy niestandardowe na na górze dbus, aby serializować API i ukryć szczegóły transportu / RPC dla podsystemu managed object service.

 3
Author: minghua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

Nie ogólny, ale QT wspiera to poprzez meta kompilator i jest GPL. Z rozmowy z QT wynika, że nie jest to możliwe z czystym C++, stąd potrzeba moc.

 2
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:53:47

Jest to notoryczna słabość języka C++ w ogóle, ponieważ rzeczy, które muszą być ustandaryzowane, aby implementacje reflection były przenośne i warte uwagi, nie są standardem. Przywoływanie konwencji, układów obiektów i manipulowania symbolami przychodzą na myśl, ale są też inne.

Brak kierunku od standardu oznacza, że implementatorzy kompilatorów będą robić pewne rzeczy inaczej, co oznacza, że bardzo niewiele osób ma motywację do napisania przenośnego biblioteka refleksji, co oznacza, że ludzie, którzy potrzebują refleksji, wymyślają koło, ale tylko tyle, ile potrzebują. Dzieje się tak ad infinitum i oto jesteśmy.

 2
Author: Ben Collins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 04:01:18

Automatyczny zestaw narzędzi do introspekcji/refleksji. Używaj meta kompilatora jak Qt i dodawaj meta informacje bezpośrednio do plików obiektowych. Intuicyjny łatwy w użyciu. Brak zewnętrznych zależności. Pozwala nawet automatycznie odzwierciedlać std:: string, a następnie używać go w skryptach. Proszę odwiedzić IDK

 0
Author: Jen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 12:25:14