gex*_*ide 1 c++ static-assert assertions c++11
static_assert 似乎是一个非常好的功能与模板.
但是,我无法在标准库中查找函数,以便在编译时进行各种测试.
例如,我正在寻找一个函数来检查类型是否是另一个类型的子类型.boost::is_base_of但是,这项工作在std中是一个类似的功能,所以我不需要依赖boost.
基本上,是否有一个很好的源代码可以在static_assertC++ 11的标准库中使用并包含在函数列表中?
什么时候static_assert执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?
除了@ rodrigo的答案(他更快......),
什么时候静态断言执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?
很不幸的是,不行.例如,无论模板如何,static_assert(false, "bummer");都始终执行a .如果您想(部分)专门化模板,这尤其会失败.
标准(第7.4节)说:
[如果条件
static_assert为false]程序格式错误,并且生成的诊断消息(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关于更多类型特征的文章,其中详细介绍了这一过程,并提供了如何优雅地解决许多与特质相关的问题的提示.
| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |