如何使用C ++ 11 static_assert进行类型约束?

时间:2013-05-03 01:49:05

标签: c++11 type-constraints static-assert

如何针对特定类型约束设置static_assert

目前,我想仅为unsigned int类型创建模板,而不是signed int类型。或者,仅适用于整数类型或特定类型名称。 static_assert(sizeof(int))仅提供基于大小的断言,我不知道如何执行任何额外检查。

我在Xcode 4.6.2中使用了Clang及其libc++。这是命令行上的当前编译器信息。

Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix

3 个答案:

答案 0 :(得分:5)

这不是static_assert的真正含义,但你可以这样做:

template<typename T>
struct Type
{
  static_assert(std::is_same<T, unsigned int>::value, "bad T");
};

或者,如果您只想让T成为某种无符号整数类型(不是特定unsigned int):

template<typename T>
struct Type
{
  static_assert(std::is_unsigned<T>::value, "bad T");
};

答案 1 :(得分:1)

这是一个脚手架:

#include <type_traits>

template<typename TNum>
struct WrapNumber
{
    static_assert(std::is_unsigned<TNum>::value, "Requires unsigned type");
    TNum num;
};

WrapNumber<unsigned int> wui;
WrapNumber<int> wi;

答案 2 :(得分:1)

要检查所有整数类型,可以使用以下内容:

#include <type_traits>
// [...]
static_assert(std::is_integral<T>::value, "The type T must be an integral type.");
// [...]