假设我想写:
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");
};
这是现场样本
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句