Обратный вызов функций-членов через стороннюю библиотеку

Я работаю с библиотекой моделирования частиц. Способ добавления взаимодействий к частицам через следующую библиотечную функцию:

AddInteraction(ParticleSet particleSet, void(*interaction)(xyz* p, xyz* v))

Теперь я хочу передать функцию-член в AddInteraction. Я так понял, что это невозможно сделать без изменения библиотечной функции. изменение библиотека - это то, чего я хотел бы избежать, но если изменение небольшое, я могу написать автору библиотеки и попросить его реализовать.

Я хочу написать простой пример того, как это можно сделать. Возможны разные решения:

  • Лямбда-выражения. Это было бы идеально, однако библиотека использует CUDA и NVCC, которые еще не поддерживают выражения Lamda.

  • Функторы. Я думал, что функторы могут сделать эту работу. Однако мне не удалось заставить их работать так, как я хочу.Например, Я не могу получить список функторов для работы. Эта проблема описана в http://www.tutok.sk/fastgl/callback.html. в Параметризация вызывающего абонента:

' Если компонент имеет много взаимосвязей обратного вызова, параметризация их всех быстро становится неработоспособной. Рассмотрим кнопку, которая хочет поддерживать динамический список вызываемых абонентов, которые будут уведомлены о событии клика. Поскольку вызываемый тип встроен в тип класса Button, этот список должен быть либо однородным, либо бестиповым».

Должен признаться, что я не понимаю всего, что написано на этом сайте, поэтому там может быть ответ.

  • Использование сторонней библиотеки. Например, «Обратные вызовы с использованием библиотеки функторов шаблонов», как описано в http://www.tutok.sk/fastgl/callback.html. или с помощью функции Boost ::. Однако для этого, вероятно, потребуются серьезные изменения в библиотеке частиц, с которой я работаю, верно?

Есть ли альтернативы? Или есть способ заставить одно из вышеперечисленных решений работать?

Большое спасибо!

Изменить:

Спасибо за ваши предложения. Они помогают, но я не вижу, как они дают полное решение моей проблемы. В частности, я пытаюсь заставить это работать:

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;
}

0
задан DnDiene 17 July 2012 в 14:35
поделиться