3

如何static_assert进行特定类型约束?

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

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

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

3 回答 3

9

这不是真正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");
};
于 2013-05-03T01:53:08.390 回答
2

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

#include <type_traits>
// [...]
static_assert(std::is_integral<T>::value, "The type T must be an integral type.");
// [...]
于 2015-08-14T10:25:35.037 回答
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;
于 2013-05-03T01:55:43.067 回答