9

次のようなものをエミュレートすることは可能ですか?

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

4 に答える 4

3

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

次の関数オブジェクトは、互いに引数として渡すことができます

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

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

foo f; bar b;
于 2011-12-13T09:12:36.657 に答える
2

typedef を直接使用することはできません。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(...)>)>)>

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

ただし、(少なくとも) 2 つのタイプのいずれかを astructまたはとして定義でき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); }
};

型を完全に「透過的に」動作させるには、コンストラクターや変換演算子を追加する必要がある場合があります。または、構造体に明示的にアクセスすることもできます。

于 2011-12-13T09:52:09.623 に答える
0

これらの関数を互いに渡すことで、あなたが説明したことを達成できました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;
}
于 2011-12-13T09:20:36.637 に答える
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);
}

そのサンプルコードを作成しましたが、動作します。多分あなたはそれを使うことができます。

于 2011-12-13T08:41:45.777 に答える