C++ Schlüsselwort: reflexpr (Reflection TS)
Von cppreference.com
[bearbeiten] Verwendung
2) Ruft den Namen von Typ und Mitglied ab.
5) Ruft die Zeile und Spalte des Quellcodes ab, wenn der Typ definiert wird.
[bearbeiten] Beispiel
reflexpr liefert uns die Metainformationen des Objekts über Meta-Objekt-Typen. Beachten Sie, dass std::reflect::get_data_members_t es Programmierern ermöglicht, jede Klasse wie std::tuple zu besuchen.
Führen Sie diesen Code aus
#include <string> #include <vector> struct S { int b; std::string s; std::vector<std::string> v; }; // Reflection TS #include <experimental/reflect> using meta_S = reflexpr(S); using mem = std::reflect::get_data_members_t<meta_S>; using meta = std::reflect::get_data_members_t<mem>; static_assert(std::reflect::is_public_v<meta>); // successful int main() {}
Wir können auch die Namensinformationen von reflexpr erfahren.
Führen Sie diesen Code aus
#include <iostream> #include <string> #include <string_view> // Reflection TS #include <experimental/reflect> template<typename Tp> constexpr std::string_view nameof() { using TpInfo = reflexpr(Tp); using aliased_Info = std::experimental::reflect::get_aliased_t<TpInfo>; return std::experimental::reflect::get_name_v<aliased_Info>; } int main() { std::cout << nameof<std::string>() << '\n'; static_assert(nameof<std::string>() == "basic_string"); // successful }
Dies ist ein Beispiel für das Abrufen des Scopes eines Typs in der Reflection TS.
Führen Sie diesen Code aus
namespace Foo { struct FooFoo { int FooFooFoo; }; } namespace Bar { using BarBar = ::Foo::FooFoo; } using BarBarInfo = reflexpr(::Bar::BarBar); using BarBarScope = ::std::experimental::reflect::get_scope_t<BarBarInfo>; // Bar, not Foo struct Spam { int SpamSpam; }; struct Grok { using GrokGrok = Spam::SpamSpam; }; using GrokGrokInfo = reflexpr(::Grok::GrokGrok); using GrokGrokScope = std::experimental::reflect::get_scope_t<GrokGrokInfo>; // Grok, not Spam