Namespaces
Variants

C++ keyword: reflexpr (reflection TS)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Verwendung

1) Ruft die Memberliste eines class -Typs oder die Enumeratorliste eines enum -Typs ab.
2) Ruft den Namen von Typ und Member ab.
3) Erkennt, ob ein Datenmember static oder constexpr ist.
4) Erkennt, ob eine Memberfunktion virtual , public , protected oder private ist.
5) Ermitteln Sie die row und column des Quellcodes, wenn der Typ definiert wird.

Beispiel

reflexpr liefert uns die Metainformationen des Objekts über Metaobjekttypen . Beachten Sie, dass std::reflect::get_data_members_t Programmierern ermöglicht, jede Klasse zu besuchen, ähnlich wie std::tuple .

#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 Namensinformationen von reflexpr abrufen:

#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 Gültigkeitsbereichs eines Typs im Reflection TS .

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