如何最好地实现具有相互依赖类型的模板类

use*_*066 4 c++ c++11

作为一个简化的例子,如果我有类

template <class T, class U> class ProcessEvent
{
  public:
    ProcessEvent(T* t) : var1(t) { var2 = new U; }
    Process() { var2->Process(var1); }
  private:
    T* var1;
    U* var2;
};

class Foo 
{
  /*data*/
};

class FooProcessor 
{
  void Process(Foo* foo) {/*functionality*/}
};

class Bar
{
  /*data*/
};

class BarProcessor 
{
  void Process(Bar* bar) {/*functionality*/}
};
Run Code Online (Sandbox Code Playgroud)

所以ProcessEvent类可以有两组不同的模板类型,

ProcessEvent<Foo, FooProcessor>
ProcessEvent<Bar, BarProcessor> 
Run Code Online (Sandbox Code Playgroud)

但是,第二个模板类型FooProcessor和BarProcessor直接由第一个模板类型暗示,并且是用户不关心的实现细节.我的目标是拥有与上面相同的功能,但让ProcessEvent只采用一个模板参数,Foo或Bar.除了通过ProcessEvent的专业化,这可以做到吗?

Mar*_*k B 6

我将假设你为了清晰而简化,并且真正使用智能指针或者至少正确地管理内存.

最简单的方法是在第一个类中使用typedef:

class Foo
{
    typedef FooProcessor Processor;
    // Stuff.
};
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中摆脱U并使用typename T::Processor.