模板参数为零时阻止模板实例化

Sca*_*ark 4 c++ templates boost c++03

我有一个模板课

template< std::size_t Size >
class Buffer
{
....
};
Run Code Online (Sandbox Code Playgroud)

当Size参数为零时,我想阻止此模板的实例化.即为以下内容生成编译器警告.

Buffer< 0 > buf;
Run Code Online (Sandbox Code Playgroud)

但所有其他变种都可行.

Buffer< 10 > buf;
Run Code Online (Sandbox Code Playgroud)

我正在寻找使用boost :: enable_if_c,但我不明白如何让它工作.

- 更新 - 遗憾的是,我无法使用任何c ++ 11功能

Nob*_*ody 10

只需将模板专门化为无法实例化的状态:

template <>
class Buffer<0>;
Run Code Online (Sandbox Code Playgroud)

这样就无法构建类.使用将导致: error: aggregate ‘Buffer<0> buf’ has incomplete type and cannot be defined


Yuu*_*shi 9

使用BOOST_STATIC_ASSERT可能更容易:

#include <boost/static_assert.hpp>

template< std::size_t Size >
class Buffer
{
    BOOST_STATIC_ASSERT(Size != 0);
};


int main()
{
    Buffer<0> b; //Won't compile
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 6

如果您的编译器支持它,请尝试static_assert:

template< std::size_t Size >
class Buffer
{
    static_assert(Size != 0, "Size must be non-zero");

    // ...
};
Run Code Online (Sandbox Code Playgroud)