如何簡單的實現型別安全的 printf?

時間 2021-05-12 01:02:32

1樓:Belleve

給你放乙個久負盛名的 gist 好了:https://

""如果你想對實現執行時的型別檢查,就實現掉 DecEq Format,乙個例子是這樣的

implementation DecEq

Format

where

......

-- 太長懶得寫

------ 使用

case decEq (formatString userInputPattern)

(FString

FEnd)of

Yes really =>

rewrite sym really in

-- 你現在知道了,userInputPattern 的模式確實是 FString FEnd

-- 那麼 printf 的型別就是 string -> string

printf userInputPattern s -- 用 rewrite 替換掉

No whynot =>

......

-- 報錯

在 Idris 裡面實現動態型別基本都是這個套路:實現乙個表示型別的 data,接下來就可以寫出 dependently-typed 的函式來「按圖索驥」了——其實也只是把其他動態型別語言中用到的細節手工寫出來罷了。

2樓:

C++ 17只要用自定義literal,把字串literal搞到型別裡去就可以了,這有什麼難的?

#include

template

...>

struct

LIST

{};template

,typename

>struct

CONS

;template

typename

...U

>struct

CONS

>>;template

typename

U>using

CONS_T

=typename

CONS

::

TYPE

;template

...>

struct

FMT_ARG

;template

...chars

>using

FMT_ARG_T

=typename

FMT_ARG

...>::

TYPE

;template

<>struct

FMT_ARG

<>;#define FMT(t

template

struct FMT_ARG<__VA_ARGS__, chars...>

using TYPE = CONS_T>

FMT(

const

char*,

'%',

's');

FMT(

unsigned

char

,'%'

,'c'

);FMT

(void*,

'%',

'p');

FMT(

double

,'%'

,'f'

);FMT

(char

,'%'

,'h'

,'h'

,'d'

);FMT

(short

,'%'

,'h'

,'d'

);FMT

(int

,'%'

,'d'

);FMT

(long

,'%'

,'l'

,'d'

);FMT

(long

long

,'%'

,'l'

,'l'

,'d'

);FMT

(unsigned

char

,'%'

,'h'

,'h'

,'u'

);FMT

(unsigned

short

,'%'

,'h'

,'u'

);FMT

(unsigned

int,

'%',

'u');

FMT(

unsigned

long

,'%'

,'l'

,'u'

);FMT

(unsigned

long

long

,'%'

,'l'

,'l'

,'u'

);template

...chars

>struct

FMT_ARG

<'%',

'%',

chars

...>

;template

char

...chars

>struct

FMT_ARG

...>

;template

,typename

>struct

Formatter

;template

typename

...F

>struct

Formatter

>>};template

...chars

>struct

STRING;};

template

T...

chars

>constexpr

Formatter

...>

,FMT_ARG_T

...>>

operator

""_fmt();

}int

main

()Rust可以用proc_macro啊,但是用了就想直接蹭 libfmt_macros 而不是自己寫parser。

3樓:HOOCCOOH

這樣?#include

#include

#include

#include

using

namespace

std;

template

...Ts

>struct

Fmttemplate

...Us

>Fmt(

Us...

lits):

f([=](

ostream&os

,Ts...args

)->ostream&)

{}string

operator

()(Ts

...args

)const

template

...Us

>auto

operator

<<(Fmt

>ri)

const}};

}template

U>auto

operator

<<(U

x)const;}

};Fmt

_int

;Fmt

>_str

;Fmt

<>fmt;

intmain()

如何實現乙個安全的thread stop的api

DamonChen 你把執行緒問題看成分布式資料一致性問題來看,只是時間超時是0,資料可以記憶體共享。然後再看陳碩說的,被外部殺了,相當於執行緒的時間超時不是0了,真的超時了,就知道只有乙份資料是很難保證資料的準確了。 一般認為執行緒是不應該可以被cancel,但stop還是可以有的,stop之後還...

C語言中強制型別轉換是如何實現的?

涇渭漳淮 強制轉換時怎麼實現的?通常是由單獨的CPU指令實現的,也就是硬體實現的。5立方之後是125,125開立方之後是幾?嚴格的數學上應該是5,但實際上計算機有精度的限制,計算結果會有誤差,計算機計算得到的結果可能是4.9999999999999435452340065849之類的,將這個值直接取...

自己彈彈簡單點的買什麼型別的鋼琴?

略懂 略懂 電鋼。費用低 符合你的預算 省空間 不會影響你的生活 不擾民 可以調音量帶耳機 麻煩少 不用調律環境寬鬆 最像鋼琴 大三角鋼琴聲音取樣,多級力度重錘鍵盤 擴充套件性高 便於學習和創作 便攜性高應用場景多 可以帶出去表演滿足下下彈點簡單的東西的小小虛榮心 追求手感選羅蘭,追求音色選山葉,選...