我有一个模板类
template< std::size_t Size >
class Buffer
{
....
};
当 Size 参数为零时,我想阻止此模板的实例化。即为以下内容生成编译器警告。
Buffer< 0 > buf;
但所有其他变体都可以。
Buffer< 10 > buf;
我正在考虑使用 boost::enable_if_c 但我不明白如何让它工作。
--Update-- 不幸的是,我不能使用任何 c++11 功能
只需将模板专门化为无法实例化的状态:
template <>
class Buffer<0>;
这样就无法构造类。使用将导致:
error: aggregate ‘Buffer<0> buf’ has incomplete type and cannot be defined
使用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;
}
如果您的编译器支持它,请尝试static_assert
:
template< std::size_t Size >
class Buffer
{
static_assert(Size != 0, "Size must be non-zero");
// ...
};
#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
}
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");
};