日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ reflection/反射

發布時間:2023/12/16 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ reflection/反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 先看一下什么叫reflecton

wiki上的定義: In computer science, reflection is the ability of a process to examine, introspect, and modify its own structure and behavior.

簡單地說,就是可以通過名字調用函數,訪問對象。而我們有一個對象,可以反推出其類型、成員/方法、成員/方法的類型。

很多編程語言都與該特性,如Java、Python

Method method = foo.getClass().getMethod("doSomething", null); method.invoke(foo, null);

這里有簡單明了的解釋。

2. C++為什么沒有reflection

我的理解:reflection 需要編譯時保存類型定義信息,即使一個類型只定義而沒有使用,這將導致編譯后的文件過大,執行速度變慢,與C++的設計理念不符。

stackoverflow上大佬說:

  • ? 不是C++委員會工作的優先事項,還有其他更高優先級的事情要做;
  • ? 大多數時候C++不需要使用refection, 不需要為不用的東西付出代價
  • ? 編譯器需要保存所有定義的類型信息...
  • ? 考慮C++中的模板, 每個特例都是一個單獨類型, 有時候模板類知道用到的時候才特例化,可能在運行的時候不存在

3. C++有哪些實現refection的方法

即使C++語言標準不支持refection,也有一些tricky的方法能實現refection

如:

https://gracicot.github.io/reflection/2018/04/03/reflection-present.html
https://github.com/apolukhin/magic_get

4. 應用舉例

獲取自定義結構體的字段個數

template <class T, std::size_t I0, std::size_t... I> constexpr auto detect_fields_count(std::size_t& out, std::index_sequence<I0, I...>)-> decltype( T{ ubiq_constructor<I0>{}, ubiq_constructor<I>{}... } ) { out = sizeof...(I) + 1; /*...*/ }template <class T, std::size_t... I> constexpr void detect_fields_count(std::size_t& out, std::index_sequence<I...>) {detect_fields_count<T>(out, std::make_index_sequence<sizeof...(I) - 1>{}); }

C++ 有關鍵字std::typeid 操作符可以獲取一個(表達式)類型的信息。

Ref:

https://en.wikipedia.org/wiki/Reflection_(computer_programming)

https://www.quora.com/What-does-reflection-in-a-programming-language-mean-in-simple-words

https://stackoverflow.com/questions/359237/why-does-c-not-have-reflection/359462

總結

以上是生活随笔為你收集整理的C++ reflection/反射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。