type erasure(二)

有了上文的准备工作,我们这里尝试实现一个简单的 type erasure。我们很快意识到,这个 type erasure 似乎与 C++ concept 有千丝万缕的联系,concept 说穿了就是为 template 建立一个更加清晰明了的 interface declaration 机制,这样传递参数的时候不再是简单的 T,而会对 T 进行 interface 的检查。type erasure 技巧恰恰不是发生在编译时的,而是将符合 interface 的对象赋值到自身,是一个运行时的行为。

我们小结一下三种做法:模板

template <typename T>
void task(const T& t) {
  // complete the task with
  t.interface();
  // it will fail if T doesn't provide such an interface at compile time
}

OO interface

struct interface_base {
  virtual void interface() = 0;
};

void task(interface_base& t) {
  // complete the task with
  t.interface();
}

以及 type erasure

struct type_erasure {
  template <typename T>
  type_erasure(T t)
    : ptr(new impl<T>(t)) {}  // add checking?

  void interface() {
    impl->interface();
  }

  struct interface_base {
    virtual void interface() = 0;
  };

  template <typename T>
  struct impl : public interface_base {
    void interface() override {
      // implementation goes here
    }
  };

  std::unique_ptr<interface_base> ptr;
};

void task(type_erasure t) {
  // complete the task with
  t.interface();
}

以上是一个简化了的 type erasure 的结构框架:

  • 通过 templated constructor 将可能的类型转换到内部的实现类
  • 每个实现类都同时实现了 type erasure 后保留下的接口 interface_base
  • 在 type_erasure 类“实现”接口(可以不是 virtual),将这个

在没有 C++ concept 的时候我们可以依赖 boost 提供的 ConceptCheck 来进行类型的检查,它的做法就是通过一个模板类在实例化的过程中会不会出错来确定一个具体的类型是否满足条件。这个工具虽然本身不是 type erasure 实现的基础,但是通过它我们可以将符合条件的类型转换到我们的 type erasure 实现类。

那么什么时候我们需要 type erasure?其实多数情况下我们不需要(前面解释了 type 可能导致的性能优化),有的时候我们可以用 OO interface 来解决问题,type erasure 更像是在 C++ 这种“畸形”社会上一种“无奈”之举,因为 C++ 充斥着大量“具有相同 signature 但是却没有一毛钱关系”的类型,如果我们需要为这些类型提供 polymorphic behavior,我们就不可避免的需要解决 template 无法用在 virtual function 上的困境。事实上,存在一类 API 实现,它将所有支持的 type 都写到不同的 API 上,比如 get_int、get_float,然后将他们全部声明为 virtual,这种情况下通过 type erasure 将会简化 API 的复杂度,我们后面找一个具体的例子详谈。

存在一些帮助实现 type erasure 的库,如 adobe Polyboost.TypeErasure。本文参考这里

——————
And she caught him by his garment, saying, Lie with me:and he left his garment in her hand, and fled, and got him out

Advertisements
type erasure(二)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s