[閒聊] C++ 有可能支援相依型別嗎?
如題,C++ 有可能在未來支援 dependent types 嗎?如果支援的話大家覺得會長怎樣?
一些 cardinality 無限大的 types 不支援完全可以理解
但是像 integrals, std::array of integral 之類的 types 要支援應該不是問題?
到了 C++20,已經很多東西都有 constexpr 的版本了
用起來已經比之前的版本開心很多,但仍然和真正的 dependent types 有一段不小的差
距
如果有一天真的能把變數當作 template arguments 傳進 templates 裡,C++ 真的會有
用很多
或者退而求其次,至少支援個 constexpr function parameters 也好
這樣至少在 constexpr 的前提下有 dependent types 可以用
有 C++ 有沒有可能在未來支援 dependent types 的掛嗎?
或是有沒有看過相關的提案或是正式的討論呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 174.112.13.222 (加拿大)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1646301843.A.E7A.html
→
03/04 09:04,
2年前
, 1F
03/04 09:04, 1F
→
03/04 11:35,
2年前
, 2F
03/04 11:35, 2F
→
03/04 11:35,
2年前
, 3F
03/04 11:35, 3F
→
03/04 12:31,
2年前
, 4F
03/04 12:31, 4F
如果要說能讓 C++ 使用者比較有感的例子的話
dependent types 可以幫你省下一堆 switch case 或 if else
例如:
switch(v)
{
case A: f<A>()...
case B: f<B>()...
...
case Z: f<Z>()...
}
有了 dp types 就可以變成一行:
f<v>()...
→
03/04 13:53,
2年前
, 5F
03/04 13:53, 5F
→
03/04 13:55,
2年前
, 6F
03/04 13:55, 6F
→
03/04 13:55,
2年前
, 7F
03/04 13:55, 7F
如果把所有 cardinality 小於某個大小的 types 的所有可能都先在 compile-time 算好
,這樣會有什麼問題嗎?
或是如果用 [[exhaustive]] 之類的 attributes 來幫指定的 type 或 function 打開 d
p types 支援,沒標的就維持跟以前一樣呢?
現在 function parameters 還是不能傳進 templates 裡面,我覺得不行 QQ
→
03/05 11:10,
2年前
, 8F
03/05 11:10, 8F
→
03/05 11:13,
2年前
, 9F
03/05 11:13, 9F
如果預設 cardinality 256 以下才自動開 dp types(這個數字應該可以用編譯器參數調
整),然後可以用 attribute 說不論某個 type 多大(只要非無限大),我想要他無視
那個 cardinality 上限支援 dp types 這樣呢?
→
03/05 11:13,
2年前
, 10F
03/05 11:13, 10F
→
03/05 11:13,
2年前
, 11F
03/05 11:13, 11F
嗯,JIT 建表加速聽起來很合理 XD
推
03/05 11:32,
2年前
, 12F
03/05 11:32, 12F
→
03/05 11:33,
2年前
, 13F
03/05 11:33, 13F
→
03/05 11:34,
2年前
, 14F
03/05 11:34, 14F
先不提如果 v 是 std::size_t 而且所有 v 的可能性你都需要自己 map 的這種極端情況
,有趣的是如果可以寫 x = f<v>() 的話,其實根本就可以不用擔心 v 實際上有哪些可
能性,例如你就可以寫:
// concrete V<...> specializations can be ad-hoc defined by user
template <std::size_t Z> struct V;
// and this would still be valid
[] (X x) { return f<V<g(x)>()>(); }
這樣你事先不需要知道 user 實際上會 specialize 哪些 V,只要 g 的邏輯讓每個 g(x)
都能確實對上一個 specialization,編譯就會過(雖然這樣好像比較像 refinement ty
pes,less like 一般的 dependent types,但意思應該有傳達到,而且這種做法也滿符
合 C++ templates 有用到才檢查的傳統的?只是現在變成"runtime 有可能用到"才檢查
而已 XD)
→
03/05 11:35,
2年前
, 15F
03/05 11:35, 15F
→
03/05 11:35,
2年前
, 16F
03/05 11:35, 16F
我覺得這好像只是把 switch case 換一種方式寫而已?f 和 v 的關係實際上還是 detac
hed 的,i.e. 每當 v 又多了一種可能性就又要回來這邊補上
Edit: 改了一下標題,這個題目討論起來應該會更有趣 XD
推
03/05 23:31,
2年前
, 17F
03/05 23:31, 17F
→
03/05 23:35,
2年前
, 18F
03/05 23:35, 18F
以上面那個例子來說的話,主要想表達的是當一般程式想和 constexpr 的程式接起來的
時候非得有個手動生出來的 if else/switch case/std::visit/lookup table etc...
但如果能把像對 templates 那樣 "用到才檢查" 的規則擴展到對傳進 templates 的一般
變數 "runtime 有可能用到才在 compile-time 先算好" 的話,就好象實現了部分 depen
dent types/refinement types 的功能了,實際感受到的改變就好象是 compiler 幫你自
動建了一個 switch case/lookup table 一樣,而且不需要自己手動維護
→
03/05 23:35,
2年前
, 19F
03/05 23:35, 19F
→
03/05 23:37,
2年前
, 20F
03/05 23:37, 20F
→
03/05 23:38,
2年前
, 21F
03/05 23:38, 21F
話說之前看過有人實測 switch case v.s. 查表的效能比較
結果查表贏了 switch case/if else 滿多的,這個結果可以代表什麼嗎?
→
03/06 00:12,
2年前
, 22F
03/06 00:12, 22F
如果是單一個 function 的時候看起來好像沒什麼差
但如果 f(g(x)) 的話,runtime 就可以不需要查表兩次
因為 compile-time 就把所有 g 的輸入 f 會有什麼輸出都算好了
→
03/06 00:12,
2年前
, 23F
03/06 00:12, 23F
→
03/06 00:13,
2年前
, 24F
03/06 00:13, 24F
呃,主要就是因為想要讓一般函數、變數能夠和現成的 TMP 無縫接軌,否則目前的 TMP
說實話真的有點雞肋...
什麼 first class types 啦之類的都好說,至少先讓一般變數也能傳進 templates 裡吧
QQ
※ 編輯: CoNsTaR (174.112.13.222 加拿大), 03/06/2022 13:08:20
→
03/06 21:22,
2年前
, 25F
03/06 21:22, 25F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章