Spec-Zone.ru › C++

Ключевое слово C++: reflexpr (спецификация отражения)

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

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

1) Получает список членов типа класса или список перечислителей типа перечисления.
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
}

Это пример получения области видимости типа в спецификации отражения.

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/cpp/keyword/reflexpr

Spec-Zone.ru

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