気になったリファラ その1

よそのブログでリファラについて言及しているのをちらちら見かけて,いつか自分でもやろうと思っていたんですが,今回気になるヤツがいくつかあったのでせっかくだから言及してみようかなと思います.
http://www.google.com/search?q=template+rebind&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja&start=10&sa=N
std::allocatorのrebindのことでしょうね,多分.型生成器(type generator)の一種と捉えることも出来ます.特にあるクラステンプレートのテンプレート引数の部分を変更した型を得るための型生成器は特にリバインダ(rebinder)と呼ばれますね.この呼び方はallocator::rebindに由来しているんでしょうか?
こういうtype generatorが必要なのはtypedef templateが無いためだって愚痴を良く聞きますが,なぜ標準にいまだ入ってないんでしょうか?200xではちゃんと入るのかなぁ・・・っていうか入れてくれないと怒りますよよよ?
一方,こういうrebinderの代替としてtemplate template引数の利用が考えられますけれど,こっちはこっちでシグネチャの完全な一致を要求するので非常に柔軟性に欠ける印象を受けるのが痛い.
上の検索でもboost::shared_ptrのドキュメントの以下の部分が引っかかってます.


[It might be convenient to relax the requirements on shared_ptr's signature, allowing an additional, defaulted, template parameter; the parameter can encode the threading model, for example. This would help in detecting possible ODR violations.

On the other hand, using shared_ptr as an argument to a template template parameter requires an exact signature match. Metaprogramming experts tend to deemphasize template template parameters as they are too inflexible, but the alternative is typically an std::allocator::rebind-type "hack".]


[shared_ptr のシグネチャの要件を緩めて 付加的なデフォルト値の与えられたテンプレート引数を許すようにすると便利かもしれません。 その引数で、たとえばスレッドモデルを指示することができるでしょう。 これは、起こりうる ODR (one definition rule) 違反を検査するのにも役立つことでしょう。

他方、テンプレート型のテンプレート仮引数に渡す実引数として shared_ptr を使うにはシグネチャの厳密な一致が要求されます。 メタプログラミングのエキスパートは、 テンプレート型のテンプレート引数はあまりにも柔軟性に欠けるとして軽んじる傾向がありますが、 その代替物というのはえてして std::allocator::rebind-type "hack" であったりするのです。]

この部分の意図は,恐らくshared_ptrにオプショナルなtemplate引数を用意しないことの理由付けの一つとして挙げているのでしょうけれど,個人的にはtemplate template引数に使われることを意識するよりも,スレッドモデルや所有権・参照カウントについてのポリシー引数をオプショナルに設定できるようにすることのほうがよっぽど重要に思えるのですが,どうなんでしょうか?
rebinderのような型生成機構もここでは"hack"なんて呼ばれてますが,最近ではもはや当たり前すぎるテクニックになっている(私の感覚がおかしいのかも知れませんがw)ので,やっぱりこの部分の主張は納得しかねるなぁという印象ですね.
というか,こういう議論はさっさと標準にtypedef templateが導入されれば一挙解決!(゜д゜)ウマーと思うんですけどねぇ・・・.あるいは,導入に当たって自分には想像もつかないような障害が存在しているのかも知れませんが・・・どうなんでしょ?
ちなみにこのrebindって依存型解決のためのtemplateキーワードの好例になりますね.

template
class C
{
  // 与えられたallocatorからintのためのallocatorを得る
  typedef typename Allocator::template rebind::other int_allocator;
};

上の通りですが,このtemplateキーワードってテンプレート引数が型名なら構文の曖昧性がないので,無くても別に構わなかったりしますね.自分が調べた範囲ではVC++7.1とGCC3.2.2ではtemplateキーワード無しでもコンパイル通ります.このtemplateキーワード(あるいはtypenameキーワード)の使用についてもコンパイラによって反応がまちまちなのを早くどうにかして欲しいところです.