有一个模板类:
template <typename T>
class CSerializer {
public:
void write(std::ostream &stream, const T &value) const;
void read(std::istream &stream, T &value) const;
};
假定仅对 PDT 类型(int、unsigned、char 等)执行此类对象的实例化。
对于其他类型,假设存在此类的特化,例如,对于 type std::string
:
template <>
class CSerializer<std::string> {
public:
void write(std::ostream &stream, const std::string &str) const;
void read(std::istream &stream, std::string &str) const;
};
更远。我们有一个界面ISerializable
:
class ISerializable {
public:
virtual ~ISerializable() = default;
public:
virtual void write_binary(std::ostream &stream) const = 0;
virtual void read_binary(std::istream &stream) = 0;
virtual size serialized_size() const noexcept = 0;
};
,以及从它继承的许多类。我想专门CSerializer
为 type设置一个类ISerializable
,例如:
template <>
class CSerializer<ISerializable> {
public:
void write(std::ostream &stream, const ISerializable &obj) const;
void read(std::istream &stream, ISerializable &obj) const;
};
它没有用 :) 为什么它没有用 - 我明白了。问题:是否可以编写这样的类特CSerializer
化,当 T 是后代类时实例化ISerializable
?
我知道如何通过 f-th 做到这一点,例如:
template <typename T, typename Enable = void>
CSerializer<T>* make_serializer() { ... }
template <typename T, typename std::enable_if<std::is_base_of< ... >>::value>
CSerializer<ISerializable>* make_serializer() { ... }
但让它成为一个“后备”选项。
UPD:他们建议在 C ++ 20 中,概念是理想的。创建了另一个问题。
一切都与函数完全相同:
好吧,作为一种选择,您可以执行以下操作: