#include <iostream>
#include <vector>
class ConcreteStream1 {
private:
friend class IStream;
inline void foo() {
std::cout << "ConcreteStream1::foo" << std::endl;
}
};
class ConcreteStream2 {
private:
friend class IStream;
inline void foo() {
std::cout << "ConcreteStream2::foo" << std::endl;
}
};
class IStream {
public:
IStream(ConcreteStream1&& concreteStream1)
: streamType(StreamType::ConcreteStream1),
storage(Storage(std::forward<ConcreteStream1>(concreteStream1))) {}
IStream(ConcreteStream2&& concreteStream2)
: streamType(StreamType::ConcreteStream2),
storage(Storage(std::forward<ConcreteStream2>(concreteStream2))) {}
inline void foo() {
switch (streamType) {
case StreamType::ConcreteStream1:
storage.concreteStream1.foo();
break;
case StreamType::ConcreteStream2:
storage.concreteStream2.foo();
break;
}
}
private:
enum class StreamType {
ConcreteStream1,
ConcreteStream2,
};
private:
StreamType streamType;
union Storage{
Storage(ConcreteStream1&& concreteStream1)
: concreteStream1(std::move(concreteStream1)) {}
Storage(ConcreteStream2&& concreteStream2)
: concreteStream2(std::move(concreteStream2)) {}
ConcreteStream1 concreteStream1;
ConcreteStream2 concreteStream2;
} storage;
};
int main() {
std::vector<IStream> streams = { ConcreteStream1{}, ConcreteStream2{} };
streams[0].foo();
streams[1].foo();
return 0;
}
понедельник, 14 июля 2025 г.
Полиморфизм на основе стирания типа
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий