Spec-Zone.ru › C++

Ключевое слово C++: reflexpr (спецификация reflection TS)

Опытная функция Функциональность, описанная на этой странице, является частью технической спецификации Reflection ISO/IEC TS 23619 (спецификация reflection TS).

Использование

1) Получает список членов типа class или список перечислений типа enum.
2) Получает имя типа и члена.
3) Определяет, является ли член данных статическим или constexpr.
4) Определяет, является ли член-функция виртуальной, общедоступной, защищённой или приватной.
5) Получает строку и столбец исходного кода, когда тип определяется.

Пример

reflexpr предоставляет нам метаинформацию об объекте через типы метаобъектов. Обратите внимание, что std::reflect::get_data_members_t позволяют программистам посещать любой класс так же, как 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() {}

Мы также можем получить информацию об имени от reflexpr.

#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
}

Это пример получения области типа в спецификации 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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/keyword/reflexpr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API