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");
};