强制编译时错误检查带有常量的模板化类型

时间:2016-09-14 15:31:14

标签: c++

这就是我想要做的事情:

#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完成吗?

1 个答案:

答案 0 :(得分: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及更高版本 要求是当我写这篇文章时,无论如何我都会留给更多的读者。