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

标签 c++ c++11 assertions static-assert

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

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

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

基本上,是否有可以在 static_assert 中使用并包含在 C++11 标准库中的函数列表的良好来源?

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

最佳答案

看看最后的C++11 draft ,第 20.7 节,特别是 <type_traits>标题。

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

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

  • 在模板中:如果表达式使用从属名称,则在实例化时;否则,在定义时间内。
  • 超出模板:在定义时间内。

关于C++11 static_assert(以及其中使用的函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11048827/

相关文章:

c++ - 如何增加 7z.exe 的可移植性

c++ - 如何使用 typedef 和可变参数模板包装除一个模板参数之外的所有模板参数?

java - 在 Java 中使用 AssertionError 和断言

c++ - 删除LevelDB实例时LevelDB断言

c++ - 将 OpenCV kinect_maps 转换为 DLL

c++ - 什么时候可以在函数及其参数之间插入未排序的代码?

c++ - 通过获取原子载荷来提升非原子载荷

c++ - C++11 中operator=(std::promise &&) 的结果是什么?

c++ - 使用 move::semantic 将大量 vector 合并为一个更大的 vector

.net - 是什么让 CLR 显示断言?