1#ifndef NEFORCE_CORE_REFLECT_ANY_HPP__
2#define NEFORCE_CORE_REFLECT_ANY_HPP__
15NEFORCE_BEGIN_NAMESPACE__
16NEFORCE_BEGIN_REFLECT__
46#define __NEFORCE_SPECIALIZE_TYPE_NAME(T) \
48 struct type_name<T> { \
49 static constexpr string_view value = #T; \
53#undef __NEFORCE_SPECIALIZE_TYPE_NAME
65 virtual ~concepts() =
default;
67 NEFORCE_NODISCARD
virtual reflect::type_id
type_id()
const noexcept = 0;
71 struct model final : concepts {
74 explicit model(T value) :
75 value_(_NEFORCE
move(value)) {}
79 NEFORCE_NODISCARD reflect::type_id
type_id()
const noexcept override {
return type_name_v<T>.to_hash(); }
107 if (other.storage_) {
108 storage_ = other.storage_->clone();
122 if (other.storage_) {
123 storage_ = other.storage_->clone();
135 NEFORCE_NODISCARD reflect::type_id
type_id() const noexcept {
return storage_ ? storage_->type_id() : 0; }
141 NEFORCE_NODISCARD
bool has_value() const noexcept {
return !!storage_; }
147 explicit operator bool() const noexcept {
return has_value(); }
154 template <
typename T>
155 NEFORCE_NODISCARD T*
cast() noexcept {
162 auto* md =
dynamic_cast<model<T>*
>(storage_.get());
163 return md ? &md->value_ :
nullptr;
171 template <
typename T>
172 NEFORCE_NODISCARD
const T*
cast() const noexcept {
179 auto* md =
dynamic_cast<model<T>*
>(storage_.get());
180 return md ? &md->value_ :
nullptr;
189 template <
typename T>
190 NEFORCE_NODISCARD T&
get() {
204 template <
typename T>
205 NEFORCE_NODISCARD
const T&
get()
const {
218 template <
typename T>
231 template <
typename T>
244NEFORCE_END_NAMESPACE__
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NORETURN void unreachable() noexcept
标记不可达代码路径
constexpr string_view type_name_v
type_name的便捷访问变量模板
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
typename decay< T >::type decay_t
decay的便捷别名
#define NEFORCE_MACRO_RANGE_ARITHMETIC(MAC)
所有算术类型列表宏
constexpr bool is_same_v
is_same的便捷变量模板
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
constexpr unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr