C++ 如何声明两个相互占用的函数';谁的签名作为论据?

C++ 如何声明两个相互占用的函数';谁的签名作为论据?,c++,boost,argument-passing,function-signature,C++,Boost,Argument Passing,Function Signature,有没有可能模仿这样的东西: typedef boost::function<void(A)> B; typedef boost::function<void(B)> A; 您是否考虑使用函数指针?< /P> #include <iostream> // void (*functionPtr)() <- declaration of function pointer void f(void (*functionPtr)()) { // exec

有没有可能模仿这样的东西:

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

您是否考虑使用函数指针?< /P>

#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);
}
#包括

//void(*functionPtr)(您的问题在技术上并不精确。签名不是作为参数传递的东西。我尽力理解你的问题

以下函数对象可以作为参数相互传递

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

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

foo f; bar b;
struct foo{
模板void操作符()(T);
};
结构条{
模板void操作符()(T);
};
福福;b栏;

我成功地实现了您所描述的,方法是将这些函数相互传递,就像
void*
一样。也许这不是最好的方法,但它确实有效(我测试过)


不能直接使用typedefs;无论在哪里使用typedef,它都等同于原始类型,因此如果您编写

typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;
,这是一种无限长的类型

但是,您可以(至少)将这两种类型中的一种定义为
结构

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

    // optional:
    void operator() (A a) { b(a); }
};
结构A;
typedef boost::函数B;
结构A
{
B B;
A(B):B(B){}
//可选:
void运算符()(A){b(A);}
};
您可能需要添加更多构造函数和/或转换运算符,以使类型的行为完全“透明”,或者只需显式访问结构

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

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