Python эквивалент магической константы PHP __DIR__?

Вы не можете напрямую передать указатель на объект-объект C ++ как указатель на код C (или даже на код C ++).

Кроме того, чтобы переносить обратный вызов на код C, он должен быть по крайней мере, объявлен как функция extern "C" non-member. По крайней мере, поскольку некоторые API требуют специальных соглашений о вызовах функций и, таким образом, дополнительных модификаторов деклараций.

Во многих средах C и C ++ имеют одинаковые соглашения о вызовах и отличаются только именем, так что любая глобальная функция или статический член Работа. Но вам все равно нужно обернуть вызов operator() в нормальной функции.

  • Если ваш функтор не имеет состояния (это объект, который должен удовлетворять некоторым формальным требованиям и т. Д.):
    class MyFunctor {
      // no state
     public:
      MyFunctor();
      int operator()(SomeType &param) const;
    }
    
    вы можете написать нормальную внешнюю функцию «C», которая создает функтор и выполняет свой оператор ().
    extern "C" int MyFunctorInC(SomeType *param)
    {
      static MyFunctor my_functor;
      return my_functor(*param);
    }
    
  • Если ваш функтор имеет состояние, например:
    class MyFunctor {
      // Some fields here;
     public:
      MyFunctor(/* some parameters to set state */);
      int operator()(SomeType &param) const;
      // + some methods to retrieve result.
    }
    
    , а функция обратного вызова C принимает какой-то параметр состояния пользователя (обычно void *):
    void MyAlgorithmInC(SomeType *arr,
                        int (*fun)(SomeType *, void *),
                        void *user_state);
    
    вы можете написать обычный экстент «C ", которая передает свой параметр состояния объекту-функтору:
    extern "C" int MyFunctorInC(SomeType *param, void *user_state)
    {
      MyFunctor *my_functor = (MyFunctor *)user_state;
      return (*my_functor)(*param);
    }
    
    и использует его следующим образом:
    MyFunctor my_functor(/* setup parameters */);
    MyAlgorithmInC(input_data, MyFunctorInC, &my_functor);
    
  • В противном случае это единственный нормальный способ сделать это (нормальный как в" без генерации машинного кода во время выполнения »и т. д.) заключается в использовании некоторого статического (глобального) или потокового локального хранилища для передачи функтора на внешнюю функцию« С ». Это ограничивает то, что вы можете сделать с вашим кодом и является уродливым, но будет работать.
16
задан 20 June 2011 в 19:23
поделиться