c++重學筆記18 - 靜態斷言檢查器

喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,

圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。


title: c++重學筆記18 - 靜態斷言檢查器
mathjax: true
date: 2020-03-15 22:44:18
categories: [c++重學筆記]
tags: [c++重學筆記]
keywords: [c++重學筆記]


我們來實現一個靜態斷言檢查器

   最前面給了一個基於構造長度爲0的數組的斷言檢查,我的編譯器似乎很強大,允許我這樣操作了。。。。我們就忽略他吧
   現在考慮到模版,我們定義一個bool型的模版,對其中的true型偏特化進行實現,false型不實現,當我們用這個類構造的時候,true會被編譯通過,但是false就不行了,
   第二種情況是,利用構造函數,似乎還是編譯器原因,我的都能編譯通過,我們也忽略吧。
   第三種情況,我們考慮用宏把msg替換成一個字符串,這樣就OK了,報錯的時候還能看到是啥錯,你只要輸入msg就可以。

namespace program_check {

// 第一種靜態檢查方法
template <bool>
struct CompiledTimeError;

template <>
struct CompiledTimeError<true> {};

// 第二種靜態檢查的方法
template <bool>
struct CompiledTimeCheck {
CompiledTimeCheck(...){};
};

template <>
struct CompiledTimeCheck<false> {};

}  // namespace program_check

// 第一代靜態檢查器
#define STATIC_CHECK_1(expr) program_check::CompiledTimeError<(expr) != 0>()
// 第二代靜態檢查器,還能輸出錯誤類型
//#define STATIC_CHECK_2(expr, msg)                                        \
{                                                                    \
class ERROR_##msg {};                                              \
(void)sizeof(                                                      \
program_check::CompiledTimeCheck<(expr) != 0>(ERROR_##msg())); \
}

// 我覺得都不太好,不如試試這個
#define STATIC_CHECK(expr,msg) \
(program_check::CompiledTimeError<(expr) != 0>(), "msg")

int main(int argc, char** argv) {
STATIC_CHECK(false,abssf );
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章