[閒聊] C++ Stateful Metaprogramming

看板C_and_CPP (C/C++)作者 (阿貓)時間6年前 (2017/09/17 13:29), 6年前編輯推噓30(33398)
留言134則, 26人參與, 最新討論串1/3 (看更多)
之前有人發現 C++11/14/17 標準有個漏洞, 透過 friend + template + noexcept 可以讓一個 constexpr expression 有不同的值 原理大概是這樣的: ============================================================================== constexpr function 可以是有定義或沒定義,這會影響到 noexcept 和 SFINAE 的結果: constexpr void f(); constexpr void g() {}; constexpr bool a = noexcept(f()); // false constexpr bool b = noexcept(g()); // true 如果我們可以控制一個 constexpr function 有無定義, 就可以將他當作一個 bit 來使用, 這點可以用 template + friend function 給定義達成: constexpr void flag(int); // 宣告 flag template<typename T> struct writer { friend void flag(T) {} // 當 writer<int> 被 instatinate 時,會定義 void flag(int) }; constexpr bool a = noexcept(flag(0)); // false writer<int> w; // instatinate `writer<int>` constexpr bool b = noexcept(flag(0)); // true static_assert(a != b); int main() { std::cout << a << ' ' << b << std::endl; // 0 1 } http://coliru.stacked-crooked.com/a/a6cc0faeb9f215c8 有了這鬼東西以後,就可以做出 compile-time 的 counter : static_assert(next() != next()); http://coliru.stacked-crooked.com/a/648448a3a8d03275 稍微包裝一下就可以做出 constify 的功能: begin_mutable_region(r); // 宣告 r auto x = r::make<int>(1); auto v = r::make<std::vector<int>>(); x.get() = 42; // 修改 x v.get().emplace_back(42); // 修改 v end_mutable_region(r); // 之後不可再修改透過 r::make 製造出來的東西 x.get() = 43; // Error v.get().clear(); // Error std::cout << x << std::endl; // 還是可以透過 const int& 存取 x http://coliru.stacked-crooked.com/a/3d63a2e82c173055 其原理就是透過設定 r 當作旗標,若 r 被設立時就關閉 non-const 的 overload 不過這個技巧被 C++ 委員會認為是 ill-formed: https://wg21.cmeerw.net/cwg/issue2118 所以未來應該會修改標準禁止這鬼東西,至於具體要怎麼做現在似乎還沒有提案 參考: Non-constant constant expressions in C++: http://b.atch.se/posts/non-constant-constant-expressions/ How to implement a constant-expression counter in C++ http://b.atch.se/posts/constexpr-counter/ 用 stateful metaprogramming 模擬 Rust 的 borrow checker: https://medium.com/@bhuztez/db4b5e94449f https://github.com/bhuztez/borrow -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.193.217 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1505626198.A.ED9.html

09/17 14:23, , 1F
XDD
09/17 14:23, 1F

09/17 15:15, , 2F
推一個, 不過我還滿好奇這要怎麼改...
09/17 15:15, 2F
※ 編輯: PkmX (140.113.193.217), 09/17/2017 15:36:12

09/17 16:48, , 3F
可能我差勁吧,覺得C++變得複雜到不行
09/17 16:48, 3F

09/17 18:44, , 4F
不只C++啊..所有程式語言都越變越複雜, 需求越來越高
09/17 18:44, 4F

09/17 18:45, , 5F
C#8, Java9, PHP7..幾十年前程式語言哪有版號的觀念
09/17 18:45, 5F

09/17 18:46, , 6F
C++ 的問題一直都是太多東西大雜燴, 不是複雜是主題太多
09/17 18:46, 6F

09/17 19:46, , 7F
C++ 威力強,可是涵蓋層面廣,難以駕馭精通。
09/17 19:46, 7F

09/17 21:21, , 8F
加了這一堆東西,會比較強? 哪之前的人有什麼寫不出來?
09/17 21:21, 8F

09/17 21:21, , 9F
不明著沒事找事.
09/17 21:21, 9F

09/17 21:37, , 10F
其實新東西大體上還是不錯, 是舊包袱甩不掉
09/17 21:37, 10F

09/17 21:38, , 11F
舊的語法實在是太多雷再不改真的要被取代了
09/17 21:38, 11F

09/17 23:43, , 12F
新的語法雷有比較少?
09/17 23:43, 12F

09/17 23:58, , 13F
組語有什麼東西寫不出來?要高階語言做什麼
09/17 23:58, 13F

09/18 00:26, , 14F
我覺得難的 template 已經很複雜了,但C++11/14裡那只是基本
09/18 00:26, 14F

09/18 00:38, , 15F
更expressive 有啥不好 你可以選擇不要用啊
09/18 00:38, 15F

09/18 06:39, , 16F
會比較強 c++11以來多了很多強力工具
09/18 06:39, 16F

09/18 06:41, , 17F
move semantics/auto/lambda/shared_ptr......
09/18 06:41, 17F

09/18 06:41, , 18F
程式碼可以選擇跑更快or比較好讀or好維護
09/18 06:41, 18F

09/18 06:45, , 19F
不想用這些東西就寫成c like阿 if+while+pointer+struct
09/18 06:45, 19F

09/18 08:03, , 20F
C++就是洪拳啊,虎形鶴形蛇形螳螂形南少林花拳全加一塊
09/18 08:03, 20F

09/18 08:41, , 21F
有這個東東可以用 我都對tmp重新燃起希望了 拜託不要修
09/18 08:41, 21F

09/18 08:41, , 22F
掉啦 QQ
09/18 08:41, 22F

09/18 10:31, , 23F
holydc +1 ,我直覺也是asm XD
09/18 10:31, 23F

09/18 11:46, , 24F
鬼扯ASM,就已經不是在討論問題了。
09/18 11:46, 24F

09/18 11:47, , 25F
C++多了一大堆,然後有人說,你可以C like 啊
09/18 11:47, 25F

09/18 11:48, , 26F
哪沒問題啊,何苦搞哪麼多?一來雷沒變少,二來反而變多
09/18 11:48, 26F

09/18 11:49, , 27F
各家的實作又不盡一致,何不修正舊有的問題?
09/18 11:49, 27F

09/18 11:49, , 28F
什麼lambda, auto的,又不是沒它們就不能寫,不好寫.
09/18 11:49, 28F

09/18 12:10, , 29F
長知識囉
09/18 12:10, 29F

09/18 12:39, , 30F
我已經看不懂這是什麼東西了(yay
09/18 12:39, 30F

09/18 12:45, , 31F
沒 auto 要多打字的確是很不好寫啊 lol
09/18 12:45, 31F

09/18 12:46, , 32F
move semantic 跟 shared pointer 也的確更好維護
09/18 12:46, 32F

09/18 12:47, , 33F
又不是叫每個人實作這些功能 只是拿來用還能嫌 lol
09/18 12:47, 33F

09/18 12:47, , 34F
愛用 c 可以用 c啊
09/18 12:47, 34F

09/18 13:14, , 35F
更炫炮
09/18 13:14, 35F

09/18 13:29, , 36F
不爽不要用 每個語言都有自己的毛和邊界問題
09/18 13:29, 36F

09/18 13:29, , 37F
不同語言適用範圍也不一樣
09/18 13:29, 37F

09/18 13:29, , 38F
你自己也說沒auto一樣可以寫程式 沒人拿槍逼你用auto
09/18 13:29, 38F
還有 56 則推文
09/20 09:50, , 95F
不就是「程式設計師」和別人不同的地方?
09/20 09:50, 95F

09/20 09:50, , 96F
要不然就寫寫程式、沒事嘴砲一下我妹也會啊
09/20 09:50, 96F

09/20 10:38, , 97F
的確是挺不雷的啊…
09/20 10:38, 97F

09/20 10:54, , 98F
MVP我前陣子才被雷到一次 orz
09/20 10:54, 98F

09/20 10:54, , 99F
不過MVP比較偏向是因為相容性而無法補齊的洞
09/20 10:54, 99F

09/20 10:54, , 100F
不過現在已經有搭另外一座橋給你就是
09/20 10:54, 100F

09/20 10:55, , 101F
另外其實compile time都是小雷 runtime才是大雷....
09/20 10:55, 101F

09/20 11:33, , 102F
我記得在板上也看過幾次被MVP雷到的問文 XD
09/20 11:33, 102F

09/20 12:27, , 103F
妹妹躺著也中槍 QQ
09/20 12:27, 103F

09/21 06:23, , 104F
幫妹妹QQ XDD
09/21 06:23, 104F

09/21 09:14, , 105F
只要能減少開發維護成本都很好:D
09/21 09:14, 105F

09/22 07:22, , 106F
universal ref是負擔? 直接可以搬rvalue的方法說慢
09/22 07:22, 106F

09/22 07:23, , 107F
我還真不知道哪個語言可以處理Lvalue比Rvalue快
09/22 07:23, 107F

09/22 07:23, , 108F
請bibo9901大大說一下 順便說一下哪個有gc和jit的語言
09/22 07:23, 108F

09/22 07:23, , 109F
效能贏過c++
09/22 07:23, 109F

09/22 07:25, , 110F
另外說C++雷的 麻煩說一下哪個語言不雷
09/22 07:25, 110F

09/22 07:25, , 111F
這邊有很多會各種語言的可以和你討論
09/22 07:25, 111F

09/22 07:35, , 112F
連特性都不懂還可以大放厥詞 真的很好笑
09/22 07:35, 112F

09/22 21:10, , 113F
既然有雷不排,放新雷? 另外,沒人說慢哦,是看有多快而已
09/22 21:10, 113F

09/22 21:11, , 114F
而且,從沒有人說過任何面向都沒缺點,只有說排雷而已.
09/22 21:11, 114F

09/22 21:12, , 115F
程式寫久了,中文邏輯會變不好.
09/22 21:12, 115F

09/22 21:14, , 116F
CPU本身就一堆雷了.
09/22 21:14, 116F

09/22 21:17, , 117F
用:不然不要用啊? 或是, 哪有沒雷的語言, 這種人根本
09/22 21:17, 117F

09/22 21:18, , 118F
沒理性討論的空間.
09/22 21:18, 118F

09/22 21:20, , 119F
充分瞭解如何對付一門語言OOXX 的,叫compiler
09/22 21:20, 119F

09/22 21:21, , 120F
寫程式是為了解決問題,而不是要發揮語言的OOXX.
09/22 21:21, 120F

09/22 21:21, , 121F
你發揮得多好都好,問題沒解決,一樣是一點價值都沒有.
09/22 21:21, 121F

09/22 23:09, , 122F
感覺根本沒講清楚怎麼雷啊 隨便丟個 mvp exception ove
09/22 23:09, 122F

09/22 23:09, , 123F
rloading implicit conversion 就說這語言很雷 沒寫篇
09/22 23:09, 123F

09/22 23:09, , 124F
文章說服大家為啥算雷 為啥沒辦法避免 我是不太信服有
09/22 23:09, 124F

09/22 23:09, , 125F
多雷
09/22 23:09, 125F

09/23 09:33, , 126F
什麼事都有辨法避免啊,不然你以為COMPILER怎麼來?
09/23 09:33, 126F

09/23 14:06, , 127F
請問樓上compiler如何寫可以不執行檢查的情況下避免使
09/23 14:06, 127F

09/23 14:06, , 128F
用者把pointer指到非法區間?
09/23 14:06, 128F

09/23 14:07, , 129F
你說什麼事都有辨法避免啊 提出來啊
09/23 14:07, 129F

09/23 16:57, , 130F
既然你那麼不爽 那就別用呀 何必讓自己那麼不開心
09/23 16:57, 130F

09/23 16:57, , 131F
對吧
09/23 16:57, 131F

09/24 00:08, , 132F
Lor 我也想知道什麼事都有辦法避免的萬能 compiler 要怎
09/24 00:08, 132F

09/24 00:08, , 133F
麼避免自己什麼事都能避免 哈哈哈哈哈
09/24 00:08, 133F

10/07 11:09, , 134F
\戰起來/ \戰起來/
10/07 11:09, 134F
文章代碼(AID): #1PlWXMxP (C_and_CPP)
文章代碼(AID): #1PlWXMxP (C_and_CPP)