C++ 11 static_assert(以及其中使用的函数)

gex*_*ide 1 c++ static-assert assertions c++11

static_assert 似乎是一个非常好的功能与模板.

但是,我无法在标准库中查找函数,以便在编译时进行各种测试.

例如,我正在寻找一个函数来检查类型是否是另一个类型的子类型.boost::is_base_of但是,这项工作在std中是一个类似的功能,所以我不需要依赖boost.

基本上,是否有一个很好的源代码可以在static_assertC++ 11的标准库中使用并包含在函数列表中?

什么时候static_assert执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?

rod*_*igo 8

看一下最终的C++ 11草案,第20.7节,特别是<type_traits>标题.

你问的是: std::is_base_of<base, derived>::value;

关于你的问题:static_assert可以在编译器认为合适时进行评估,但通常会:

  • 在模板中:如果表达式使用依赖名称,则在实例化时间内; 否则,在定义时间.
  • 模板外:在定义时间.

  • n3092实际上是在最终选秀前大约一年.n3290是标准完成之前的最新可用草案.您应该使用n3337,它是在标准化之后立即使用的,并且与官方标准的唯一区别是更正的拼写错误等. (2认同)

Kon*_*lph 5

除了@ rodrigo的答案(他更快......),

什么时候静态断言执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?

很不幸的是,不行.例如,无论模板如何,static_assert(false, "bummer");始终执行a .如果您想(部分)专门化模板,这尤其会失败.

标准(第7.4节)说:

[如果条件static_assertfalse]程序格式错误,并且生成的诊断消息(1.4)应包括字符串文字的文本,[...]

遗憾的是,这种情况非常不明确,但这种缺乏特异性实际上正是static_assert在它不依赖于模板类型时的行为方式.

您需要使用static_assert依赖于模板参数的条件将其执行绑定到特定模板参数.

所以以下会失败:

template <typename T>
struct some_type {
    static_assert(false, "T must be a pointer type");
};

template <typename T>
struct some_type<T*> {
    // …
};
Run Code Online (Sandbox Code Playgroud)

最后,我衷心建议您阅读Marthino关于更多类型特征的文章,其中详细介绍了这一过程,并提供了如何优雅地解决许多与特质相关的问题的提示.