policy-based class design

前面探讨过一次 policy 的应用,我们后面也讨论过 g++ 中提供的额外的数据结构 PBDS,这就是利用这类思想编写的库。这里记录一些在 Modern C++ Design 一书里面提到的相关知识。简单的说 policy 是 compilation-time strategy patern,这意味着我们需要将一个复杂的物体首先 decouple 成若干 interface,然后为每个 interface 实现一些具体的称为 policy class 的东西,某些 policy 可能含有额外的功能,最后我们通过继承这些 policy class 让 hosting class 具有各种需要的东西。

下面我们讨论一些实现上的问题。

template-template parameters

这个主要是希望解决这样一个问题,

template <class T>
struct default_policy {
  // implementation goes here
} ;

template <class T, class Policy>
class host : public Policy {
  // more stuffs here
} ;

// when u want to use
{
  host<int, default_policy<int> > something ;
}

你得重复写 type,长期来一种流行的解决方案是通过 policy class 中的 typedef,

template <class T>
struct default_policy {
  typedef T value_type ;
  // implementation goes here
} ;

template <class Policy>
class host : public Policy {
  typedef Policy::value_type value_type ;
  // more stuffs here
} ;

// when u want to use
{
  host<default_policy<int> > something ;
}

通过所谓 template-template parameters 实现则是下面的写法:

template <class T>
struct default_policy {
  // implementation goes here
} ;

template <class T>
struct special_policy {
  // implementation goes here
} ;

template <class T, template <class> class Policy = default_policy>
class host : public Policy<T> {
  // more stuffs here
} ;

template <template <class> class Policy>
class widget_host : public Policy<widget> {
  // a specific host
} ;

// when u want to use
{
  host<int> something ;
  widget_host <special_policy> w ;
}

policy 的 destructor

一般不会使用 virtual destructor,同时甚至把 destructor 放在 protected 里面避免被显式调用。

optional functionality through incomplete instantiation

如果某些 hosting function 依赖了特定 policy 的特殊函数,如果编译时并没调用该函数,则因为模板不使用不编译的特性,是不会报错的。这样可以放心的使用特殊的 policy。

compatible and incompatible policy

由于 host class 是继承 policy,而 policy 并不是相关的 class(一般来说)。因此如果希望 host 可以转换,则需要为 policy 提供 conversion operator,这样可以选择哪些 policy 是 compatible 哪些不是。

最后 share 一段很有意思的说法:

Design is choice. Most often, the struggle is not that there is no way to solve a design problem, but that there are too many ways that apparently solve the problem… Further more, choices can be combined, which confers on design an evil multiplicity.

—————–
And he blessed him, and said, Blessed be Abram of the most high God, possessor of heaven and earth:

Advertisements
policy-based class design

发表评论

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