Несмотря на то, что я довольно много читал о шаблонах, я впервые пытаюсь использовать их. Таким образом, моей проблемой может быть просто отсутствие понимания шаблонов.
У меня есть класс, который должен независимо и периодически генерировать некоторые данные. Когда появляются новые данные, он вызывает родителя через функцию обратного вызова и отправляет данные. Предполагается, что класс должен быть переносимым, то есть шаблонным родителем.
Но если я использую шаблон в своем классе данных, я должен перетаскивать шаблон со мной в каждую функцию, и он просто кажется ненужным сложным для того, чтобы быть простов состоянии вызвать одну функцию. Поэтому я создал небольшой класс обратного вызова в глобальном пространстве имен, который хотел использовать в качестве интерфейса.
namespace wrapper
{
//Callback class
template<typename ParentClass>
class Data_Callback
{
public:
ParentClass* m_parent = nullptr;
Data_Callback<ParentClass>(ParentClass* parent)
{
m_parent = parent;
};
void DoCallback(DataClass* data)
{
if (m_parent)
m_parent->callback_func(*data);
}
};
//global object I want to use for callback
template<typename ParentClass>
std::unique_ptr<Data_Callback<ParentClass>> m_parentCallback;
template<typename ParentClass>
PatientenErkennung GetNewDataClass(ParentClass* parent)
{
m_parentCallback = std::make_unique<Data_Callback<ParentClass>>(parent);
std::shared_ptr<DataClass> obj = std::make_shared<DataClass>();
return obj;
};
}
Затем я могу вызвать свою глобальную функцию «GetNewDataClass», как это из моего родительского класса:
m_data = wrapper::GetNewDataClass(this);
Но когда я хочу вызвать обратный вызов из DataClass, шаблон становится таким:
wrapper::m_parentCallback<I_DONT_HAVE_THIS>->DoCallback(data);
Я не могу вызвать этот глобальный объект, не зная родительского класса, могуЯ? Таким образом, обратный вызов может быть инициализирован только из класса Data_Callback, но этот класс не содержит данных.
Как вы решаете это? Наследование может быть? Или дизайн как таковой не годится для использования? Как я уже говорил, я хочу избежать перетаскивания моего большого DataClass шаблона вокруг DataClass, хотя это будет работать ...