2011-12-13 9 views

答えて

2

typedefでは直接入力できません。 typedefが使用されている場所、それが元の型へ同等ですので、あなたが

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

を書く場合は

を得るまで、その後 Bは、その上の boost::function<void(boost::function<void(B)>)>と同等であり、 boost::function<void(A)>、 に相当します
boost::function<void(boost::function<void(boost::function<void(...)>)>)> 

これは無限の長さのタイプです。

ただし、定義することができます(少なくとも)などの2つのタイプのいずれか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

あなたは関数ポインタを使用することを検討していました?

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

私はそのサンプルコードを作成しています。たぶんあなたはそれを使うことができます。

3

あなたの質問は技術的に正確ではありません。署名は引数として渡すものではありません。私はあなたの質問を理解するために最善を尽くします。

次関数オブジェクトは、私はあなただけvoid*としてお互いにこれらの関数を渡すことで説明ものを達成するために管理

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

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

foo f; bar b; 
0

お互いへの引数として渡すことができます。多分それは一番良い方法ではないかもしれませんが、動作します(私はそれをテストしました)。

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; 
} 
関連する問題