4

テンプレート化されたクラスがあります

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

Size引数がゼロの場合、このテンプレートのインスタンス化を防ぎたいです。つまり、次のコンパイラ警告を生成します。

Buffer< 0 > buf;

しかし、他のすべてのバリアントは機能します。

Buffer< 10 > buf;

boost :: enable_if_cの使用を検討していますが、それを機能させる方法がわかりません。

-更新-残念ながら、c++11の機能は使用できません

4

5 に答える 5

10

テンプレートを、説明できない状態に特化するだけです。

template <>
class Buffer<0>;

そうすれば、クラスを構築できません。使用すると、次のようになります。 error: aggregate ‘Buffer<0> buf’ has incomplete type and cannot be defined

于 2012-10-05T08:02:21.857 に答える
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;
}
于 2012-10-05T08:04:50.910 に答える
6

コンパイラがサポートしている場合は、次を試してくださいstatic_assert

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

    // ...
};
于 2012-10-05T08:17:06.133 に答える
1
#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
}
于 2012-10-05T07:59:00.537 に答える
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");
};
于 2013-06-06T02:10:06.610 に答える