ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
965443 Топик полностью
fk0, легенда (17.12.2019 00:48 - 00:56, просмотров: 207) ответил _Constantin24 на Есть прототип функции:
Oсталось только подумать, как сделать, чтоб развиртуализация таки происходила, иначе вариант с виртуальными функциями ничем принципиально не хуже. PS: по ссылке более другой вариант, без thiz (и не const уже). https://coliru.stacked-crooked.com/a/aa6894110dee76ae
#include <stdio.h> #include <stddef.h> #include <array> // Base class, which will be passed to CreateThread() function. class ThreadBase { protected: struct ThreadOps { size_t (*stack_size)(const void *); void* (*stack_base)(const void *); void (*run)(void *); }; private: const ThreadOps& thread_ops; void *thiz; public: constexpr ThreadBase(const ThreadOps& ops, void *impl) : thread_ops(ops), thiz(impl) {} size_t stack_size() const noexcept { return thread_ops.stack_size(thiz); } void *stack_base() const noexcept { return thread_ops.stack_base(thiz); } void run() const { return thread_ops.run(thiz); } }; void CreateThread(const ThreadBase &thread) { printf("creating stack of size %lu bytes at %p\n", long(thread.stack_size()), thread.stack_base()); thread.run(); } // Auxiliary class, from which particular Thread implementation should be inherited (see below). template <typename Impl> class Thread : public ThreadBase { private: static const ThreadOps ops; protected: constexpr Thread() : ThreadBase(ops, static_cast<Impl*>(this)) {} }; // Implementation of virtual functions table by hand... template <typename Impl> const typename ThreadBase::ThreadOps Thread<Impl>::ops = { [](const void *thiz) -> size_t { return static_cast<const Impl*>(thiz)->stack_size(); }, [](const void *thiz) -> void * { return static_cast<const Impl*>(thiz)->stack_base(); }, [](void *thiz) -> void { return static_cast<Impl*>(thiz)->run(); } }; // Particular Thread implementation, parametrized by stack size. template <size_t SIZE> class ThreadImpl : public Thread<ThreadImpl<SIZE> > { private: mutable std::array<int, SIZE> stack; public: constexpr ThreadImpl() : stack() {} constexpr size_t stack_size() const { return SIZE; } void* stack_base() const { return &stack[0]; } void run() { puts("thread run()"); } }; constexpr const ThreadImpl<42> thread_info; int main() { CreateThread(thread_info); return 0; }
[ZX]