C++ 的 idioms(十六)

thin template

thin template 的意思就是希望通过某种手段减少 template 造成的“目标代码”冗余。我们知道尽管 template 秉持不用就不 generate code 的原则,但是像智能指针这类 template 其实有非常大的冗余度,因为本质上就是存放了一个指针,别的什么就是析构的时候调用的析构函数不同。那么怎么减少这部分代码呢?thin template 使用的策略是将公共的部分写到一个 base 中,然后使用模版继承。

class base {
  void* ptr ;
public:
  // many more...
} ;
template <class T>
class ptr : public base {
  // something needs specialized handling
} ;

traits

是 STL 里面常用的一种手段,尽管有人批评,但是使用起来比较简单,也不需要对原来的类进行修改。通常可以在 traits 类里面提供 typedef、常量、某些 free function 等等。

type generator

这其实是对一个复杂的 template 进行特化,因此往往定义一个简单的结构

template <class Arg>
struct certain_type {
  typedef complicated<Arg1, ...> type ;
} ;

// so you don't need to write complicated<Arg1, ...>
certain_type<int> something ;

type-safe enum

这个其实与 safe bool 的问题类似,但是感觉有用的多。为了获得需要的 enum 不同无法比较的效果,最好的方式是 redefine 对应的 operator,让他们只接受同类的。同时由于是对原来类型的封装,为了写一个 reusable 的 solution 我们可以考虑 parametrized base 的 idiom。wikibooks 上有如下的 code 供我们参考:

template<typename def, typename inner = typename def::type>
class safe_enum : public def {
  typedef typename def::type type;
  inner val;
public:
  safe_enum(type v) : val(v) {}
  inner underlying() const { return val; }
  bool operator == (const safe_enum & s) const { return this->val == s.val; }
  bool operator != (const safe_enum & s) const { return this->val != s.val; }
  bool operator <  (const safe_enum & s) const { return this->val <  s.val; }
  bool operator <= (const safe_enum & s) const { return this->val <= s.val; }
  bool operator >  (const safe_enum & s) const { return this->val >  s.val; }
  bool operator >= (const safe_enum & s) const { return this->val >= s.val; }
};

struct color_def {
  enum type { red, green, blue };
};
typedef safe_enum<color_def> color;

嗯,另外上面还写了如果需要遍历 enum 提供的 begin/end 对应的 iterator。

type selection

这其实是 boost.mpl 里面实现的 if 类型的模板。比较常用,比如 call traits 之类的需要根据情况设定不同的 parameter type。

virtual friend

如何让一个 friend 具有 polymorphism,一个核心的想法(例子见这里)是:首先在 base 里面将这个 friend 加入,但是实现的时候将其 delegate 给一个 virtual 的成员函数,这样子类实现不同的版本即可,这也可以看成是一个 template method。

小结

最近两周比较疯狂的搞完了这部分 C++ 的东西,的确是对 C++ 有了一个比较完整的重新的认识。下面会看一些 code,并且自己写不少 code,为将来做好准备了。后面如果 wikibooks 出现了更新,也会继续跟进这些的。但是现在告一段落了。

——————
And when the fowls came down on the carcasses, Abram drove them away.

Advertisements
C++ 的 idioms(十六)

发表评论

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