2

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

但是,我很难在标准库中找到用于在编译时进行各种测试的函数。

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

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

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

4

2 回答 2

8

看看最终的C++11 草案,第 20.7 节,尤其是<type_traits>标题。

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

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

  • 在模板中:如果表达式使用依赖名称,则在实例化时间;否则,在定义时间。
  • 超出模板:在定义时间内。
于 2012-06-15T10:23:22.343 回答
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*> {
    // …
};

最后,我衷心推荐你阅读 Marthino 关于更多类型特征的文章,该文章更详细地介绍了这个过程,并给出了如何优雅地解决许多与 trait 相关的问题的提示。

于 2012-06-15T10:25:34.247 回答