c++ - C++:创建一个模板函数,只允许继承特定接口的类?
问题描述
假设我想写:
class JsonSerializable {
public:
virtual JsonDocument toJsonDocument();
virtual void fromJsonDocument();
}
还有一个功能:
void readJson(foo &foo, string path){
// file open and close machinery
JsonDocument = get_json_doc(file);
foo.fromJsonDocument(JsonDocument);
}
现在,我想立即写:
template <class T>
void readJson(T &t,...){
...
};
现在它是通用的,问题是:我不能将模板函数的使用限制为仅JsonSerializable
.
如何通过修改以下行来完成此任务:
template<class T> // somehow restrict T to "T such that T is also JsonSerializable"
解决方案
你正在寻找std::is_base_of
一个static_assert
-
std::is_base_of<B, D>
在编译时检查 D 是否派生自 B。
static_assert
执行编译时检查,如果针对false
.
有了这些,你可以检查是否T
是一个Serializable
对象:
template <class T>
void read(const T& t){
static_assert(std::is_base_of<Serializable, T>::value, "class need to be Serializable");
};
这是一个现场样本
推荐阅读
- css - 如何在带有网格的引导程序 3 行中水平和垂直居中内容?
- sql - SQL*Plus Oracle 中的列格式化
- sql-server - 将逗号分隔值转换为多列表
- javascript - Maximo 任何地方错误 - 没有运行时环境部署到此服务器'
- docker - 如何通过 Google Cloud Build 中的步骤设置环境或替换变量?
- time - NetCDF:减去时间步长
- excel - Excel VBA中的不活动计时器
- python - 为具有多个包的项目正确设置 virtualenv
- asp.net - ASP.NET 高级 [FromBody] 映射
- java - java - 循环中的变量对象属性