使用模板化方法键入擦除

时间:2015-06-26 14:05:42

标签: c++ templates polymorphism type-erasure

我有许多类,它们采用未指定类型的对象并返回具有固定类型的结果。另外,这些对象是模板化的,它们改变了结果的计算。我想将这些对象隐藏在一个通用接口后面。下面的例子应该说清楚。 struct Work是接口,并且存在多个类,如struct WorkImpl。此外,还有多种类型,例如struct Astruct B相互作用。就我而言,它们也是模板化的,不能是多态的。问题是如何转发"工作调用WorkImpl对象?

#include <iostream>

struct Result
{

};

struct Work
{
  virtual ~Work() { }

  template <typename U>
//  virtual Result work(const U& u) = 0;  // this is not possible, of course!
  Result work(const U& u) { std::cout << "Work" << std::endl; }
};

struct B
{

};

struct A
{
  A& operator =(const B& b) { return *this; }
  Result result() { return Result(); }
};

template <typename T>
struct WorkImpl : public Work
{
  template <typename U>
  Result work(const U& u)
  {
    std::cout << "WorkImpl" << std::endl;
    T t;
    t = u;
    return t.result();
  }
};

int main()
{
  Work* w = new WorkImpl<A>();
  w->work(B());
  return 0;
}

1 个答案:

答案 0 :(得分:0)

我真的不明白这个问题是什么。

代码编译。

你不想要多态,但

  • 你忘了静态多态也是多态的
  • 你无偿使用继承,尽管事实上没有共同的界面

我建议只从界面中取出参数。键入擦除的最简单方法是使用std::function<Result()>并完成。

如果需要,我可以添加一个小样本。