C++ C++;:创建一个只允许继承了特定接口的类的模板函数?

C++ C++;:创建一个只允许继承了特定接口的类的模板函数?,c++,templates,C++,Templates,假设我想写: 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.from

假设我想写:

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,...){
   ...
};

您正在使用
静态断言查找
std::is_base_of
-

std::如果D是从B派生的,则在编译时检查它的基础是什么

static\u assert
执行编译时检查,如果测试为
false
,则会导致编译器错误

通过这些选项,您可以检查
T
是否是可序列化的
对象:

template <class T>
void read(const T& t){
   static_assert(std::is_base_of<Serializable, T>::value, "class need to be Serializable");
};
模板
无效读取(常数T&T){
static_assert(std::is_base_of::value,“类需要可序列化”);
};

这里有一个

你所说的“也是JsonSerializable”是什么意思?它应该有相同的接口吗?或者从
JsonSerializable
继承的任何类型?如果模板使用接口,则实际上
T
受到限制,因为如果它不提供接口,将出现编译器错误。限制到子类是有点不常见的,如果您正在使用运行时多态性,那么您实际上不需要模板,并且该方法可以简单地获取类型为
JsonSerializable&
的参数,因为您有一个接口,并且您只希望获取实现该接口的对象。。。那么,为什么不简单地
readJson(JsonSerializable&foo,string path)
?@StoryTeller UnslanderMonica lol我正试图想出一个激发答案的例子……如果您使用的是模板,为什么不
template concept JsonSerializable=requires(T){{T.toJsonDocument()}->std::converable_to;{T.fromJsonDocument()}
不过这是一种变通办法,不是吗?因为理想情况下,IDE可以通过检查语法来发现函数中的内容,而不是在运行时使用信息性消息失败。这根本不是一个解决方法。这是一位语言律师。您声明此方法可以接受这些规则,并给出一个错误,表示“我,程序员,已经为此方法提供了一个规则,您没有遵循它”。没有它,一切都可以使用内部使用的方法。任何带有
toJsonDocument()
方法的类都可以在其内部使用,这与您的问题“仅允许继承了特定接口的类”的陈述相反@donlan这不是运行时信息消息。这是一个编译时检查。如果规则被破坏,它将不会编译。你检查过活样品了吗?
template <class T>
void read(const T& t){
   static_assert(std::is_base_of<Serializable, T>::value, "class need to be Serializable");
};