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); }
};