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

时间:2012-10-05 07:55:16

标签: c++ templates boost c++03

我有一个模板类

template< std::size_t Size >
class Buffer
{
....
};

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

Buffer< 0 > buf;

但所有其他变体都可以使用。

Buffer< 10 > buf;

我正在考虑使用boost :: enable_if_c,但我不明白如何让它工作。

- Update-- 不幸的是,我无法使用任何c ++ 11功能

5 个答案:

答案 0 :(得分:10)

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

template <>
class Buffer<0>;

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

答案 1 :(得分: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;
}

答案 2 :(得分:6)

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

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

    // ...
};

答案 3 :(得分:0)

#include <stddef.h>

typedef ptrdiff_t Size;

template< Size size >
class Buffer
{
    static_assert( size > 0, "" );
};

int main()
{
#ifdef  ZERO
    Buffer<0>   buf;
#else
    Buffer<1>   buf;
#endif
}

答案 4 :(得分:0)

std::enable_if

template <std::size_t N, typename = typename std::enable_if<!!N>::type>
class Matrix {};

static_assert

template <std::size_t N>
class Matrix
{
    static_assert(N, "Error: N is 0");
};