函数注册与动态组合(2)

我们需要一个 type erasure layer 用来封装 C++ 本身的 strongly typed 行为,暴露给一个 weakly typed 语言的接口。这样一来我们就可以使用其他的 dynamic language 来组装我们的基本原件了。

type erasure layer

我们这里讨论一个简单的 type erasure layer 的设计方法。我们实现一个简单的连接它们的 API。首先我们有这样的 API

struct node {
  virtual ~node() {}

  // Returns ingree and outgree
  virtual int input_count() const = 0;
  virtual int output_count() const = 0; 

  // type checks
  virtual std::type_index input_type(int i) const = 0;
  virtual std::type_index output_type(int i) const = 0;

  // accessor
  virtual boost::any output_ptr(int i) const = 0;

  // connection
  virtual node& connect(node& another, int in, int out) = 0;

  // execution
  virtual void run() = 0;
};

我们理论上应该把这些 virtual API 弄成非 virtual 的(使用 non-virtual interface pattern,结合 template method pattern 做一些基本的检查,比如访问越界,类型匹配),简单起见暂不这样做。很显然,我们可以有两类基本的 node,一类是常数,一类是函数。

template <typename T>
struct cnode : public node;

using int_node = cnode<int>;
using float_node = cnode<float>;
REGISTER_SUBCLASS(node, int_node);
REGISTER_SUBCLASS(node, float_node);

这样一来注册了基本的 cnode 类型,我们就可以建立一些 graph 中的 source。相对而言第二类更有意思一点

template <typename Func, Func ptr>
struct fnode : public node;

int foo(int a, char b);
REGISTER_FUNCTION(foo);

有了这些,我们另外加上一层 representation 就可以很容易在其他的语言中进行操纵。比如如下的一个 protobuf 的表示层

message Value {
  message Proto {
    optional string type = 1;
    optional string payload = 2;
  }
  oneof kind {
    int32 int32_value = 1;
    int64 int64_value = 2;
    float float_value = 3;
    Proto proto_value = 4;
  }
}

message Function {
  optional string name = 1;
  repeated string input = 2;
  repeated string output = 3;
}

message Node {
  optional string display = 1;
  oneof kind {
    Value constant = 2;
    Function function = 3;
  }
}

之后我们就可以通过某种方式表达这些 node 之间的关联

node input_val = {
  constant = {
    int32_value = 1
  }
}

node step1 {
  function foo {
    input path = input_val
    output result {}
  }
}

node step2 {
  function bar {
    input value = step1.result
  }
}

这样看来 so far so good,下面我们要来看看这些类型是如何实现的。

Advertisements
函数注册与动态组合(2)

发表评论

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