Я работаю с библиотекой моделирования частиц. Способ добавления взаимодействий к частицам через следующую библиотечную функцию:
AddInteraction(ParticleSet particleSet, void(*interaction)(xyz* p, xyz* v))
Теперь я хочу передать функцию-член в AddInteraction. Я так понял, что это невозможно сделать без изменения библиотечной функции. изменение библиотека - это то, чего я хотел бы избежать, но если изменение небольшое, я могу написать автору библиотеки и попросить его реализовать.
Я хочу написать простой пример того, как это можно сделать. Возможны разные решения:
Лямбда-выражения. Это было бы идеально, однако библиотека использует CUDA и NVCC, которые еще не поддерживают выражения Lamda.
Функторы. Я думал, что функторы могут сделать эту работу. Однако мне не удалось заставить их работать так, как я хочу.Например, Я не могу получить список функторов для работы. Эта проблема описана в http://www.tutok.sk/fastgl/callback.html. в Параметризация вызывающего абонента:
' Если компонент имеет много взаимосвязей обратного вызова, параметризация их всех быстро становится неработоспособной. Рассмотрим кнопку, которая хочет поддерживать динамический список вызываемых абонентов, которые будут уведомлены о событии клика. Поскольку вызываемый тип встроен в тип класса Button, этот список должен быть либо однородным, либо бестиповым».
Должен признаться, что я не понимаю всего, что написано на этом сайте, поэтому там может быть ответ.
Есть ли альтернативы? Или есть способ заставить одно из вышеперечисленных решений работать?
Большое спасибо!
Изменить:
Спасибо за ваши предложения. Они помогают, но я не вижу, как они дают полное решение моей проблемы. В частности, я пытаюсь заставить это работать:
std::vector interactionList;
void AddInteraction(void(*func)(xyz*,xyz*))
{
interactionList.push_back(func);
}
void Simulate()
{
for(size_t i = 0; i < interactionList.size(); i++)
{
interactionList[i](0,0); //Would normally be called for every particle
}
}
class Cell {
public:
void UpdateParticle(xyz* p, xyz* v);
Cell()
{
AddInteraction(this->UpdateParticle); //Does not work
}
};
int main()
{
Cell cell1;
Cell cell2;
for(int i = 0; i < 100; i++)
{
Simulate();
}
return 1;
}