#include <iostream>
// ------------------------ interface ------------------------
template<typename T>
struct IMeta
{
inline void foo() { return static_cast<T*>(this)->_foo(); }
};
template<typename T>
struct IPayload
{
inline void bar() { return static_cast<T*>(this)->_bar(); }
};
template<typename T>
struct IStream : public T, public IPayload<IStream<T>>, public IMeta<IStream<T>>
{
inline void baz() { return static_cast<T*>(this)->_baz(); }
};
// ------------------------ implementation ------------------------
template<typename T>
class Meta
{
friend class IMeta<IStream<T>>;
inline void _foo()
{
std::cout << "Meta::_foo::a = " << static_cast<T*>(this)->a << std::endl;
}
};
template<typename T>
class Payload
{
friend class IPayload<IStream<T>>;
inline void _bar()
{
std::cout << "Payload::_bar::a = " << static_cast<T*>(this)->a << std::endl;
}
};
class Stream : public Meta<Stream>, public Payload<Stream>
{
friend class IStream<Stream>;
friend class Meta<Stream>;
friend class Payload<Stream>;
uint64_t a = 3;
inline void _baz()
{
std::cout << "Stream::_baz::a = " << a << std::endl;
}
};
// ------------------------ usage ------------------------
int main()
{
IStream<Stream> stream;
stream.foo();
stream.bar();
stream.baz();
return 0;
}
вторник, 9 января 2024 г.
Статический полиморфизм в С++
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий