Как объявить две функции, принимающие подписи друг друга в качестве аргумента?
Можно ли подражать что-то вроде этого:
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 ответа
Не возможно напрямую с 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(...)>)>)>
, который является типом бесконечной длины.
Однако вы можете определить (по крайней мере) один из двух типов как 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); }
};
Возможно, вам понадобится добавить больше конструкторов и / или оператора преобразования, чтобы тип вел себя "прозрачно", или вы можете просто получить явный доступ к структуре.
Ваш вопрос не является технически точным. Подпись - это не то, что вы передаете в качестве аргумента. Я стараюсь изо всех сил, чтобы понять ваш вопрос.
Следующие функциональные объекты могут быть переданы в качестве аргумента друг другу
struct foo {
template<typename T> void operator()(T);
};
struct bar {
template<typename T> void operator()(T);
};
foo f; bar b;
Мне удалось добиться того, что вы описали, передав эти функции друг другу так же, как 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;
}
Вы рассматривали возможность использования указателей на функции?
#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);
}
Я сделал этот пример кода, и он работает. Может быть, вы могли бы использовать это.