предотвратить создание шаблона, когда аргумент шаблона равен нулю

У меня есть шаблонный класс

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

Я хотел бы предотвратить создание экземпляра этого шаблона, когда аргумент Size равен нулю. т.е. генерировать предупреждение компилятора для следующего.

Buffer< 0 > buf;

но все остальные варианты будут работать.

Buffer< 10 > buf;

Я смотрю на использование boost :: enable_if_c, но я не понимаю, как заставить его работать.

—Обновить—
Я не могу использовать любые функции C ++ 11, к сожалению

4

Решение

использующий 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;
}
9

Другие решения

Просто специализируйте шаблон в состоянии, которое невозможно установить:

template <>
class Buffer<0>;

Таким образом, класс не может быть построен. Использование приведет к:
error: aggregate ‘Buffer<0> buf’ has incomplete type and cannot be defined

10

Если ваш компилятор поддерживает это, попробуйте static_assert:

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

// ...
};
6

#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
}
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");
};
0