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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

發(fā)布時(shí)間:2025/3/12 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

到現(xiàn)在為止,C++ 仍然是計(jì)算機(jī)編程領(lǐng)域的經(jīng)典語(yǔ)言之一,C++ 17 標(biāo)準(zhǔn)在2017上半年已經(jīng)探討確定。本期我們匯集了編程專(zhuān)家——祁宇(《深入應(yīng)用 C++ 11》作者,C++ 開(kāi)源社區(qū) purecpp.org 創(chuàng)始人)的多年心得小結(jié),并具體介紹了 C++ 17 最新標(biāo)準(zhǔn)中值得開(kāi)發(fā)者關(guān)注的新特點(diǎn)和基本用法。

文/祁宇

本文將借助分析 magic _ get 源碼來(lái)介紹 magic _ get 實(shí)現(xiàn)的關(guān)鍵科技,深入剖析實(shí)現(xiàn) pod 類(lèi)型反射的機(jī)理。

反射是一種根據(jù)元數(shù)據(jù)來(lái)獲得類(lèi)外部信息的模式,通過(guò)元數(shù)據(jù)就可以獲得對(duì)象的字段和技巧等信息。C# 和 Java 的反射模式都是通過(guò)獲得對(duì)象的元數(shù)據(jù)來(lái)推動(dòng)的。反射可以用于依賴(lài)注入、ORM 對(duì)象-實(shí)體映射、序列化和反序列化等與對(duì)象原本信息密切相關(guān)的領(lǐng)域。比如 Java 的 Spring 框架,其依賴(lài)注入的基礎(chǔ)是構(gòu)建在反射的基礎(chǔ)之上的,可以按照元數(shù)據(jù)獲取類(lèi)型的信息并動(dòng)態(tài)建立對(duì)象。ORM 對(duì)象-實(shí)體之間的映射也是借助反射實(shí)現(xiàn)的。Java 和 C# 都是基于前面運(yùn)行時(shí)的語(yǔ)言,中間運(yùn)行時(shí)提供了反射模式,所以反射針對(duì)運(yùn)行時(shí)語(yǔ)言來(lái)說(shuō)很容易,但是針對(duì)沒(méi)有中間運(yùn)行時(shí)的語(yǔ)言,要想實(shí)現(xiàn)反射是很困難的。

在2016年的 CppCon 技術(shù)大會(huì)上,Antony Polukhin 做了一個(gè)關(guān)于 C++ 反射的發(fā)言vc6.0怎么寫(xiě)c語(yǔ)言,他強(qiáng)調(diào)了一個(gè)實(shí)現(xiàn)反射的新思路,即無(wú)需使用宏、標(biāo)記和額外的軟件就能推動(dòng)反射。看起來(lái)似乎是一件不也許完成的任務(wù),因?yàn)?C++ 是沒(méi)有反射模式的,無(wú)法直接獲得對(duì)象的元信息。但是 Antony Polukhin 發(fā)現(xiàn)對(duì) pod 類(lèi)型使用 Modern C++ 的模板元方法可以實(shí)現(xiàn)這種的編譯期反射。他開(kāi)源了一個(gè) pod 類(lèi)型的編譯期反射庫(kù) magic _ get(),這個(gè)庫(kù)也打算開(kāi)啟 boost。我們來(lái)看看 magic _ get 的使用示例。

#include struct foo { int some_integer; char c;};foo f {777, '!'};auto& r1 = boost::pfr::flat_get<0>(f); //通過(guò)索引來(lái)訪問(wèn)對(duì)象foo的第1個(gè)字段auto& r2 = boost::pfr::flat_get<1>(f); //通過(guò)索引來(lái)訪問(wèn)對(duì)象foo的第2個(gè)字段

通過(guò)這個(gè)例子可以發(fā)現(xiàn),magic _ get 確實(shí)實(shí)現(xiàn)了非侵入式訪問(wèn) foo 對(duì)象的數(shù)組,不需要寫(xiě)任何宏、額外的代碼或者專(zhuān)門(mén)的軟件,直接在編譯期就可以訪問(wèn) pod 對(duì)象的數(shù)組,沒(méi)有運(yùn)行期負(fù)擔(dān),確實(shí)有點(diǎn) magic。

本文將借助分析 magic _ get 源碼來(lái)介紹 magic _ get 實(shí)現(xiàn)的關(guān)鍵科技,深入剖析實(shí)現(xiàn) pod 類(lèi)型反射的機(jī)理。

實(shí)現(xiàn) pod 類(lèi)型反射的模式是這么的:先將 pod 類(lèi)型轉(zhuǎn)化為對(duì)應(yīng)的 tuple 類(lèi)型,接下來(lái)將 pod 類(lèi)型的值賦給 tuple,然后就可以通過(guò)索引去訪問(wèn) tuple 中的元素了。所以推動(dòng) pod 反射的關(guān)鍵就是如何將 pod 類(lèi)型轉(zhuǎn)化為對(duì)應(yīng)的 tuple 類(lèi)型和 pod 值數(shù)組給 tuple。

pod 類(lèi)型對(duì)應(yīng)的 tuple 類(lèi)型是什么樣的呢?以下面的 foo 為例,foo 對(duì)應(yīng)的 tuple 應(yīng)該是 tuple,即 tuple 中的元素種類(lèi)和排序和 pod 類(lèi)型中的數(shù)組完全一一對(duì)應(yīng)。

根據(jù)結(jié)構(gòu)體生成一個(gè) tuple 的基本模式是,按次序?qū)⒔Y(jié)構(gòu)體中每個(gè)數(shù)組的類(lèi)別萃取出來(lái)并儲(chǔ)存起來(lái),后面再取下來(lái)生成對(duì)應(yīng)的 tuple 類(lèi)型。然而字段的類(lèi)別是不同的,C++ 也沒(méi)有一個(gè)能直接保存不同類(lèi)型的容器vc6.0怎么寫(xiě)c語(yǔ)言,因此必須一個(gè)變通的方式,用一個(gè)間接的方式來(lái)儲(chǔ)存萃取出來(lái)的字段類(lèi)別,即將類(lèi)型轉(zhuǎn)化為一個(gè) size _ t 類(lèi)型的 id,將這個(gè) id 保存到一個(gè) array 中,后面根據(jù)這個(gè) id 來(lái)獲得實(shí)際的 type 并生成對(duì)應(yīng)的 tuple 類(lèi)型。

這里應(yīng)該解決的一個(gè)問(wèn)題是怎樣推動(dòng)類(lèi)型和 id 的互相轉(zhuǎn)換。

先通過(guò)一個(gè)空的模板類(lèi)用來(lái)存放實(shí)際的類(lèi)別,再通過(guò) C++ 14 的 constexpr 特性,在編譯期返回某個(gè)類(lèi)別對(duì)應(yīng)的編譯期 id,就可以實(shí)現(xiàn) type 轉(zhuǎn)換為 id 了。具體代碼如下:

https://ipad-cms.csdn.net/cms/article/code/3445

上面的代碼在編譯期將類(lèi)別 int 和 char 做了一個(gè)編碼,將類(lèi)別轉(zhuǎn)換為一個(gè)具體的編譯期常量,后面就可以按照這種編譯期常量來(lái)獲得對(duì)應(yīng)的詳細(xì)類(lèi)型。

編譯期根據(jù) id 獲取 type 的代碼如下:

constexpr auto id_to_type( std::integral_constant<:size_t> ) noexcept { int res{}; return res; }constexpr auto id_to_type( std::integral_constant<:size_t> ) noexcept { char res{}; return res; }

上面的代碼中 id _ to _ type 返回的是 id 對(duì)應(yīng)的類(lèi)別的示例,如果要獲得 id 對(duì)應(yīng)的類(lèi)別還必須借助 decltype 推導(dǎo)出來(lái)。magic _ get 通過(guò)一個(gè)宏將 pod 基本類(lèi)別都做了一個(gè)編碼,以推動(dòng) type 和 id 在編譯期的互相轉(zhuǎn)換。

#define REGISTER_TYPE(Type, Index) \ constexpr std::size_t type_to_id(identity) noexcept { return Index; } \ constexpr auto id_to_type( std::integral_constant<:size_t index=""> ) noexcept { Type res{}; return res; } \// Register all base types here REGISTER_TYPE(unsigned short , 1) REGISTER_TYPE(unsigned int , 2) REGISTER_TYPE(unsigned long long , 3) REGISTER_TYPE(signed char , 4) REGISTER_TYPE(short , 5) REGISTER_TYPE(int , 6) REGISTER_TYPE(long long , 7) REGISTER_TYPE(unsigned char , 8) REGISTER_TYPE(char , 9) REGISTER_TYPE(wchar_t , 10) REGISTER_TYPE(long , 11) REGISTER_TYPE(unsigned long , 12) REGISTER_TYPE(void* , 13) REGISTER_TYPE(const void* , 14) REGISTER_TYPE(char16_t , 15) REGISTER_TYPE(char32_t , 16) REGISTER_TYPE(float , 17) REGISTER_TYPE(double , 18) REGISTER_TYPE(long double , 19)

將類(lèi)別編碼以后,保存在那里或者怎么取下來(lái)是接著要緩解的難題。magic _ get 通過(guò)定義一個(gè) array 來(lái)保存結(jié)構(gòu)體字段類(lèi)別 id。

template struct array { typedef T type; T data[N]; static constexpr std::size_t size() noexcept { return N; } };

array 中的定長(zhǎng)數(shù)組 data 中保存數(shù)組類(lèi)型對(duì)應(yīng)的 id,數(shù)組下標(biāo)就是字段在結(jié)構(gòu)體中的位置索引。

前面介紹了怎樣實(shí)現(xiàn)字段類(lèi)別的保存和獲得,那么這個(gè)字段類(lèi)別是怎樣從 pod 結(jié)構(gòu)體中萃取出來(lái)的呢?具體的做法分為三步:

下面是詳細(xì)實(shí)現(xiàn)代碼:

template constexpr auto fields_count_and_type_ids_with_zeros() noexcept { static_assert(std::is_trivial::value, "Not applyable"); array<:size_t sizeof> types{}; detect_fields_count_and_type_ids(types.data, std::make_index_sequence{}); return types;}template constexpr auto array_of_type_ids() noexcept { constexpr auto types = fields_count_and_type_ids_with_zeros(); constexpr std::size_t count = count_nonzeros(types); array<:size_t count=""> res{}; for (std::size_t i = 0; i < count; ++i) { res.data[i] = types.data[i]; } return res; }

定義 array 時(shí)必須定義一個(gè)固定的變量長(zhǎng)度,長(zhǎng)度為多少適合呢?應(yīng)按結(jié)構(gòu)體最多的字段數(shù)來(lái)確認(rèn)。因?yàn)榻Y(jié)構(gòu)體的數(shù)組數(shù)最多為 sizeof(T),所以 array 的長(zhǎng)度設(shè)置為 sizeof(T)。array 中的元素全部初始化為0。一般情況下,結(jié)構(gòu)體字段數(shù)通常不會(huì)超過(guò) array 的厚度,那么 array 中就經(jīng)常出現(xiàn)多余的元素,所以還必須將 array 中多余的數(shù)組移除,只儲(chǔ)存有效的泛型類(lèi)別 id。具體的做法是計(jì)算出 array 中非零的元素有多少,接著再把非零的元素賦給一個(gè)新的 array。下面是推導(dǎo) array 非零元素個(gè)數(shù),同樣是通過(guò) constexpr 實(shí)現(xiàn)編譯期計(jì)算。

本文來(lái)自電腦雜談,轉(zhuǎn)載請(qǐng)注明本文網(wǎng)址:

http://www.pc-fly.com/a/jisuanjixue/article-129594-1.html

總結(jié)

以上是生活随笔為你收集整理的C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。