Как объявить две функции, принимающие подписи друг друга в качестве аргумента? - PullRequest
9 голосов
/ 13 декабря 2011

Возможно ли подражать что-то вроде этого:

typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;

Основная цель - написать такой код (на псевдо-c ++):

void a_(B b) {
  // ...
  b(a_);
}
void b_(A a) {
  // ...
  f(boost::bind(a, b_));
}

f(boost::bind(a_, b_));

Ответы [ 4 ]

3 голосов
/ 13 декабря 2011

Ваш вопрос технически не точен.Подпись не является чем-то, что вы передаете в качестве аргумента.Я изо всех сил стараюсь разобраться в вашем вопросе.

Следующие функциональные объекты могут передаваться друг другу в качестве аргумента

struct foo { 
  template<typename T> void operator()(T);
};

struct bar {
  template<typename T> void operator()(T);
};

foo f; bar b;
2 голосов
/ 13 декабря 2011

Не возможно напрямую с typedefs;где бы ни использовался typedef, он эквивалентен исходному типу, поэтому если вы напишите

typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;

, тогда B будет эквивалентно boost::function<void(A)>, что эквивалентно boost::function<void(boost::function<void(B)>)> и т. Д., Пока вы не получите

boost::function<void(boost::function<void(boost::function<void(...)>)>)>

, который является типом бесконечной длины.

Однако вы можете определить (по крайней мере) один из двух типов какa struct или class:

struct A;
typedef boost::function<void(A)> B;
struct A
{
    B b;
    A(B b) : b(b) {}

    // optional:
    void operator() (A a) { b(a); }
};

Вам может потребоваться добавить больше конструкторов и / или оператор преобразования, чтобы тип работал совершенно «прозрачно», или вы могли просто получить явный доступ к структуре.

0 голосов
/ 13 декабря 2011

Мне удалось добиться того, что вы описали, передав эти функции друг другу так же, как void*.Может быть, это не самый хороший способ, но он работает (я проверял это).

typedef void (*A)(void*);
typedef void (*B)(void*);

void afun(void* _bf) {
    B _bfun = (B)_bf;
    _bfun((void*)afun);
}

void bfun(void* _af) {
    A _afun = (A)_af;
    f(boost::bind(_afun, (void*)bfun));
}

int main(int argc, char** argv) {
    f(boost::bind(afun, (void*)bfun));
    return 0;
}
0 голосов
/ 13 декабря 2011

Рассматривали ли вы использование указателей на функции?

#include <iostream>

  // void (*functionPtr)() <- declaration of function pointer
void f(void (*functionPtr)()) {
  // execute the function that functionPtr points to
  (*functionPtr)();
}

void a() {
  std::cout << "Function a()" << std::endl; 
}

int main() {
  f(a);
}

Я сделал этот пример кода, и он работает.Может быть, вы могли бы использовать его.

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