Я хотел бы иметь следующую настройку класса в программе:
- Класс, который реализует буфер. При заполнении этого буфера будет создан поток, который выполняет обратный вызов для обработки действий с полным буфером.
- Шаблон базового класса, который включает объект буфера. Реализует функцию обратного вызова, которая выполняет вызов виртуальной функции, определенной в производном классе.
- Производный класс, который наследуется от базового класса и реализует, что делать с данными.
Во-первых, минимальный воспроизводимый пример:
#include <vector>
#include <iostream>
#include <thread>
template <typename T>
class CallbackBuffer
{
public:
std::vector<T> buffer;
void (*callback)(std::vector<T>);
std::thread writerThread;
CallbackBuffer(int bufferSize = 10)
{
buffer.resize(bufferSize);
}
void setCallback(void (*cb)(std::vector<T>))
{
callback = cb;
}
void writeCall()
{
writerThread = std::thread(callback, buffer);
}
};
template <typename T>
class Base
{
public:
CallbackBuffer<T> buffer;
Base()
{
buffer.setCallback(bufferHandler);
}
void bufferHandler(std::vector<T> v)
{
for(auto &i : v)
{
write(i);
}
}
virtual void write(T i) = 0;
};
class Derived : public Base<int>
{
public:
Derived()
{
}
void write(int i)
{
std::cout << i << std::endl;
}
};
int main()
{
Derived d;
return 0;
}
Я получаю следующую ошибку компилятора:
error: invalid use of non-static member function ‘void Base<T>::bufferHandler(std::vector<T>) [with T = int]’
Таким образом, компилятору необходимо bufferHandler , чтобы быть stati c, но если бы я это сделал, у меня не было бы доступа к членам объекта. Есть ли способ разобраться в этом, или просто ужасная идея?