Как использовать лямбду C ++ для преобразования указателя на функцию-член в обычный указатель на функцию для использования в качестве обратного вызова - PullRequest
0 голосов
/ 10 мая 2019

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

Вот как должна выглядеть (примерно) результирующая функция:

// This is the code I want to interface with:

typedef void func(ParamClass param); // ParamClass is NOT my class

extern void notMyCode1(func funcArg); // Code I want to call, saves funcArg
extern void notMyCode2()  // uses saved funcArgs


// Here is the type of class I want to instantiate:

class MyClass {
   public:
       MyClass(int arg) : saveArg(arg) {}

       int saveArg;

   void myFunc(ParamClass param) {
       // uses saveArg and param to do the right action
   }

};

void useCase(void) {
   for (int i = 0; i < max; ++i) {
       MyClass myInstance(Myclass(i)); // maybe need vector to hold these?
       notMyCode1(myInstance.myFunc); // this code is what I don't know how to write
    }
    notMyCode2();
}

Фон.Библиотека, которую я хочу назвать, - это Google Benchmark.notMyCode1 - это их функция регистрации тестов.notMyCode2 запускает тесты, которые были зарегистрированы.ParamClass - это данные, которые их код передает в бенчмарк.

Теперь обычно передают простую функцию C в код регистрации, по одному на каждый бенчмарк, который он хочет запустить.Однако я хочу запускать один и тот же код снова и снова, параметризуя его по этому номеру «i», и каждый «i» обрабатывается как отдельный тест.Итак, я хочу захватить «i» в классе (или через лямбду, но что-то, что дает мне несколько указателей на функции C со значением «i», связанным в каждом из них).Я попытался сделать «i» параметром для эталонного теста и передать его, но затем код эталонного теста интерпретировал «i» как нечто для суммирования (и я хочу, чтобы каждый «i» рассматривался как уникальный эталонный тест с другим параметром для статистикидля расчета).

Это похоже на то, что должно быть простым делом (это просто замыкание), но я не слишком разбираюсь в указателях функций (или лямбдах C ++).Если бы это был мой код, я бы просто передал экземпляр класса, но это не так.

Я видел примеры использования статических функций в классе, но я специально хочу захватить значение "i "и получить несколько указателей на функции, каждый из которых захватывает различное значение" i ".

1 Ответ

6 голосов
/ 10 мая 2019

Вы не можете.

Лямбда имеет преобразование в указатель на функцию только в том случае, если она не имеет состояния (т. Е. Нет захватов).Чтобы вызвать функцию-член из лямбды, вам нужен указатель на объект, с помощью которого вызывается функция-член.Это фиксируется, делая лямбда-объект не конвертируемым в простой указатель на функцию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...