喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,
圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。
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 );
}