2

私が持っているとしましょう:

template<typename T>
class A { 
  typedef T t_type;
  void done_work();
};

template<typename T>
class B { 
  typedef T t_type;
  void do_work(){
    // adds work to an asynchronous event queue, eventually T.done_work() is called
  }
};

template<typename T>
class C { 
  typedef T t_type;
  void do_work(){
    // adds work to an asynchronous event queue, eventually T.done_work() is called
  }
};

typedef A<B<A > > a_with_b;
typedef A<C<A > > a_with_C;

void main(int argc, char** argv){
  a_with_b awb;
  a_with_c awc;
}

typedef a_with_bを解決するにはどうすればよいですか?

AにはBへのコールバックがあり、BにはAへのコールバックがあるため、これを実行したいと思います。たとえば、AはB.do_work()を呼び出し、最終的にBはA.done_work()を呼び出します。さらに、これらはそれぞれ非同期呼び出しであるため、Aには他にも重要な作業があるため、B.do_work()を呼び出して、Bが「done」を返すまで待つことはできません。

AにBを参照させることができない理由は、CなどのBを置き換える他の実装が存在する可能性があるためです。

4

3 に答える 3

2

AにはBへのコールバックがあり、BにはAへのコールバックがあるため、これを実行したいと思います。たとえば、AはB.do_work()を呼び出し、最終的にBはA.done_work()を呼び出します。

理想的には、そもそも相互依存関係を回避する必要があります。例:

template<class T> struct A {
    std::function<void (T)> handler;
    void f(T) {}
    void work() { handler(T()); }
};
template<class T> struct B {
    std::function<void (T)> fn;
    void f(T) {}
    void work() { handler(T()); }
};

// ..
A<int> a;
B<int> b;
a.handler = std::bind(&B::f, &b);
b.handler = std::bind(&A::f, &a);
于 2012-02-17T19:08:34.457 に答える
2

std::functionこの場合、型消去アプローチの方が好きですが、元のコードを機能させることは可能です。

テンプレートテンプレートパラメータを使用して、以下を定義しますA

template<template<typename> typename T>
class A { 
  typedef T<A> t_type;
  void done_work();
};

template<typename T>
class B { 
  typedef T t_type;
  void do_work(){
    // adds work to an asynchronous event queue, eventually T.done_work() is called
  }
};

template<typename T>
class C { 
  typedef T t_type;
  void do_work(){
    // adds work to an asynchronous event queue, eventually T.done_work() is called
  }
};

typedef A<B> a_with_b;
typedef A<C> a_with_c;

int main(int argc, char** argv){
  a_with_b awb;
  a_with_c awc;
}

いくつかの変更があることに注意してください。タイプの代わりにテンプレートAを使用するようになりました。

Bまた、とは変更されていないことに注意してくださいC

于 2017-11-28T07:30:43.370 に答える
1

できません。

あなたの場合、それらの少なくとも1つはテンプレートであってはなりません。

この場合、テンプレートが必要ですか?2つのクラスAとBまたはAとCが非常に緊密に結合されているため、一方が他方を明示的に参照している場合は、クラスBとCでテンプレートを使用しないでください。これらのクラスは、何かで特殊化できないためです。それ以外の場合は、コールバックの魔法全体を壊すことなく。

ちなみに、sigc++のようなコールバックライブラリが必要かもしれません。

于 2012-02-17T19:06:00.380 に答える