【发布时间】:2022-01-12 10:52:22
【问题描述】:
我有一个带有纯虚拟read 和write 函数的ISerializable 接口。我还有一个List<T> 课程。所以,我的问题是:只有当T 也继承自ISerializable 时,我才能从ISerializable 继承我的List<T> 吗?
用法示例:
#include <array>
#include <iostream>
class ISerializable
{
public:
virtual void read(std::istream& stream) = 0;
virtual void write(std::ostream& stream) = 0;
};
class A : public ISerializable {
public:
void read(std::istream& stream) override {}
void write(std::ostream& stream) override {}
};
class B {};
template<typename T>
class List : public ISerializable
{
public:
void read(std::istream& stream) override
{
for (int i = 0; i < items.size(); i++)
{
items[i].read(stream);
}
}
void write(std::ostream& stream) override
{
for (int i = 0; i < items.size(); i++)
{
items[i].write(stream);
}
}
private:
std::array<T, 10> items;
};
int main()
{
List<A> list_a;
//List<B> list_b; <- error here
}
【问题讨论】:
-
@kiner_shah - “仅当”位呢?
-
简单的解决方案可能是
template <typename T> class List : public std::conditional_t<std::is_base_of_v<ISerializable,T>, ISerializable, ???>...。唯一的问题是,在错误条件的情况下,您需要从其他一些基础派生,例如一些帮助器空INonSerializable类。 -
@StoryTeller-UnslanderMonica,实际上我不确定这个问题,我试图确认我的理解是否正确。似乎不正确:-)
-
@kiner_shah 之类的。我扩展了你的 sn-p:godbolt.org/z/73MhjbWxo
标签: c++ templates inheritance c++20 c++-concepts