C++0x

http://gusmachine.blog49.fc2.com/blog-entry-439.html

釣られてみる。

これ、いろいろきれいになるんだけど、前書いたときfind(「templateでの述語」と「型リスト」を受け取って、「最初に述語を満たす型とそのindex」を返すことにした)とreverseがうまくかけなかった。
reverseは普通のconsでつないだリストのreverseと大して変わらないだけなんだけど、
なぜかfindはなんか微妙な感じに。loopとifが混じると若干きもい。

#include <stdio.h>

template<typename... T> class TypeList {};

namespace impl {
  template<bool, template<typename...> class PRED, typename... T>
  class FindImpl;

  // 見つかった場合
  template<template<typename...> class PRED, typename HD, typename... TL>
  class FindImpl<true, PRED, HD, TL...> {
  public:
    enum { value = 0 };
    typedef HD Type;
  };

  // 見つからなかった場合
  template<template<typename...> class PRED,
           typename HD, typename TL1, typename... TL2>
  class FindImpl<false, PRED, HD, TL1, TL2...> {
  private:
    typedef FindImpl<PRED<TL1>::value != 0, PRED, TL1, TL2...> Next;
  public:
    enum { value = Next::value + 1 };
    typedef typename Next::Type Type;
  };
}

template<template<typename...> class PRED, typename... T> class Find;
template<template<typename...> class PRED, typename HD, typename... TL>
class Find<PRED, TypeList<HD, TL...>> {
private:
  typedef impl::FindImpl<PRED<HD>::value != 0, PRED, HD, TL...> Impl;
public:
  enum { value = Impl::value };
  typedef typename Impl::Type Type;
};

// テスト用のtemplate
template<typename T> class is_int {
public:
  enum { value = 0 };
};

template<> class is_int<int> {
public:
  enum { value = 1 };
};

int main() {
  printf("%d\n", Find<is_int, TypeList<int, char>>::value);
  printf("%d\n", Find<is_int, TypeList<double, float, char, int>>::value);
  return 0;
}

みつからなかったら、多分コンパイルエラー。
なんだろう、言い表せないこのきもさ・・・。とくにFindImplのあたりが。。。
多分、trueとfalseの時のやってることのgapが大きすぎるのがきもいんだと、思う。
きっと、「え、普通だろ」って思う人もいるかも。(TypeList使ってる時点で、それはそれでレアか・・・。)
何も考えずに書いたらこうなった。もうちょいきれいになるんだろうか・・・。
えろいひとだれか教えて。
あ、いや綺麗さだけならfilter->head とかでいいんだけど、余計なクラスとか生成するとコンパイル時間がすてきなことになりそうで。。。
大丈夫なんだろうか?やっぱり教えて、だれかえろい人。