 fk0легенда (17.12.2019 00:48 - 00:56, просмотров: 261) ответил _Constantin24 на Есть прототип функции:
 fk0легенда (17.12.2019 00:48 - 00:56, просмотров: 261) ответил _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]