首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板法类型擦除

模板法类型擦除
EN

Stack Overflow用户
提问于 2015-06-26 14:05:42
回答 1查看 1.3K关注 0票数 2

我有许多类,它们接受一个未指定类型的对象,并返回一个固定类型的结果。此外,这些对象被模板化,这将改变结果的计算。我想把这些对象隐藏在一个公共接口后面。下面的例子应该很清楚。struct Work是接口,并且存在多个类,比如struct WorkImpl。此外,还有多个类型,如struct Astruct B,它们相互作用。在我的例子中,它们也是模板化的,不能是多态的。问题是如何将工作调用“转发”到WorkImpl对象?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-26 14:13:07

我不太明白问题是什么。

代码编译。

你不想多态,但是

  • 您忘记了静态多态也是多态。
  • 您可以无偿地使用继承,尽管根本没有公共接口。

我建议把参数从界面上拿出来。输入擦除最简单的方法是使用std::function<Result()>并完成。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31075314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档