パラメータ化継承 (C++テンプレートテクニック)

こんなこともできるのか.と目から鱗だった話.
pp74, 3-6 から.


ほとんど本のサンプルのままだけど:

// extend_param.cpp

#include <iostream>
#include <string>

using namespace std;

class text
{
public:
  text() {}
  ~text() {}
  string out(const string& str) const { return str; }
};

template <class Base>
class p : public Base {
public:
  string out(const string& str) const { return "<p>" + Base::out(str) + "</p>"; }
};

template <class Base>
class a : public Base {
public:
  string out(const string& str) const { return "<a>" + Base::out(str) + "</a>"; }
};

int main(int argc, char *argv[])
{
  a<p<text> > hoge;
  cout << hoge.out("fuga") << endl;
  // output: <a><p>fuga</p></a>
  return 0;
}


継承元をテンプレートパラメータによって決められるという話.

それと,3章の趣旨はGeneric Programming ということで,C++STL について.テータ構造とアルゴリズムを分離したことにより,データ構造を受け持つ, vector, list, set ... などと,アルゴリズム sort, copy, ... などを別々にそれぞれ1つずつ実装し,iterator を仲介して,1つのアルゴリズムの実装で複数のデータ構造に対応できる,という話.この話は前PFIでちらっとだれかから教えてもらったときにもすげえなあ,これ考えたやつはんぱねえ天才だなあ,などと思ったけど,再確認.なかなか面白い.


C++テンプレートテクニック

C++テンプレートテクニック