2016-09-14 72 views
1

這就是我要做的:強制編譯時錯誤檢查模板類型以恆定

#define SIZE 8 

template<class T> 
struct name { 
    T a; 
    name() { 
     #if SIZE != sizeof(T)*8 
     #error Size mismatch 
     #endif 
    } 
}; 

int main(void) 
{ 
    name<uint16_t> a; //Size mismatch 

    return 0; 
} 

我希望它給一個編譯時錯誤使用時的大小不匹配模板結構,即name<uint16_t>應該給出編譯時錯誤,因爲它不符合要求(sizeof(T)*8 == 8)

這可以在<C++11

+0

boost有自己的STATIC_ASSERT版本http://www.boost.org/doc/libs/1_61_0/doc/html/boost_staticassert.html –

+0

@πάνταῥεῖ:這可能會解決我的問題,但我發現一個' enable_if'實現[這裏](http://en.cppreference.com/w/cpp/types/enable_if)。用法:'template :: type> struct name ...'(我正準備發佈它作爲答案:D) – Jahid

回答

2

可以斷言它:

static_assert(SIZE != sizeof(T)*8, "!"); 

您的代碼就變成了:

#include<cstddef> 

#define SIZE 8 

template<class T> 
struct name { 
    static_assert(SIZE != sizeof(T)*8, "!"); 
    T a; 
}; 

int main(void) { 
    name<uint16_t> a; 
    return 0; 
} 

編輯

這個答案適用於C++ 11及更高版本。
我的要求是,當我寫下它時,無論如何我都會留給更多的讀者。

+0

我會指出,這個答案是C++ 11和更高版本 –

+0

@ nasser-sh OP是不是要求?他說 - _Can可以在C++ 11中完成。 – skypjack

+0

啊!如果你看看帖子的編輯歷史,OP表示「必須在