2003-01-10 117616 [長年日記]

mem_data_t

std::mem_funと同じような感じで、構造体のメンバにアクセスできるといいなと思って作ってみました。

template<class T, class U>
struct mem_data_t : public std::unary_function<T, U>
{
  mem_data_t(U T::*p) : p_(p) {}
  U operator()(T* p) const { return p->*p_; }
  U T::*p_;
};
 
template<class T, class U>
mem_data_t<T, U> mem_data(U T::*p)
{
  return mem_data_t<T, U>(p);
}

使うときにはこんな感じで。

struct Foo {
  int a_;
  char b_;
};
std::vector<Foo*> v;
// vの中からa_が5のものを検索
std::find_if(v.begin(), v.end(),
  std::bind2nd(
    binary_compose_f_gx_hy(
      std::equal_to<int>(),
      mem_data(&Foo::a);
      std::identity<int>()),
    5));

参照版のmem_data_ref_tも同じように作成しておきます。

こことかも参考になるかも。

mem_data_tでsort

こんな感じかな?

std::sort(v.begin(), v.end(),
  binary_compose_f_gx_hy(
    std::less<int>(),
    mem_data(&T::a_),
    mem_data(&T::a_)));