c++ - C++ 验证模板类型
问题描述
对不起我的英语不好,我会尽力做到最好。
我想设计一个应该像这样使用的界面:
class MyObject : public IMyInterface<MyObject>
{
// ...
};
界面可能如下所示:
template <class _TMyObject>
class IMyInterface
{
virtual _TMyObject* Get() = 0;
};
我正在关注的是一种在编译时验证接口是否按预期使用的方法。如何测试_TMyObject
“is-a”IMyInterface<_TMyObject>
是否?在接口定义中,例如带有 static_assert 。
谢谢你的帮助 :)。祝你今天过得愉快!
解决方案
不能放在static_assert
类本身里面,因为D
是不完整的类型,但是可以放在析构函数(或者构造函数,但可以有很多构造函数)中:
template<class D>
struct B
{
~B()
{
static_assert(std::is_base_of_v<B, D>);
};
};
struct Not_E {};
struct D : B<D> { };
struct E : B<Not_E> { };
void foo()
{
D d; // OK
E e; // Fails
}
添加。请注意,此解决方案不能完全防止错误使用 CRTP。请参阅Some Programmer Dude的回答,以获取无法被它捕获的错误的一个很好的例子。
推荐阅读
- dc.js - 更改 d3.scaleLinear().domain() 上的最小最大颜色范围
- python - 如何在具有多个条件的python中为数据框创建逻辑语句?
- python - 如何将数学数字转换为浮点数
- javascript - 由于多个请求,对 Node.js 服务器的请求超时
- google-colaboratory - 在 Google Colaboratory Notebook 上使用 Geoviews 绘制 Xarray 图像
- regex - 如何在匹配前后对模式进行 sed
- deep-learning - 在不使用面部识别的情况下识别一个人的最佳方法(深度学习)
- sql-server - 超集 sqlalchemy 错误:没有名为“pymssql”的模块
- r - 从这个嵌套的 R 列表中提取数据的优雅、实用的方法
- node.js - 如何使用 req.body 保存猫鼬对象