命名空间
变体
操作

C++ 关键字: reflexpr (反射 TS)

来自 cppreference.com
< cpp‎ | 关键字
 
 
C++ 语言
 
 

[编辑] 用法

1) 获取 类型的成员列表,或 枚举 类型的枚举器列表。
2) 获取类型和成员的名称。
3) 检测数据成员是否为 staticconstexpr
4) 检测成员函数是否为 virtualpublicprotectedprivate
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
}

这是在 反射 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