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/