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]