首页 > 解决方案 > 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"

标签: c++templates

解决方案


你正在寻找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");
};

这是一个现场样本


推荐阅读