concept_map 使って AOP にゃ

concept_map 使って aspect-oriented に書こうとすると,異なる concept_map 導入する関数を各々書く感じになるんかにぇ?

concept G<T>
{
  void do(T &);
}

template<G T>
concept SynchronizedG<std::pair<T, std::mutex>>
  : G<std::pair<T, std::mutex>>
{
  void do(std::pair<T, std::mutex> &p){
    std::unique_lock lk(p.second);
    G::do(p.first);
  }
}

template<G T>
void g(T const &t)
{
  do(t);
}

template<G T>
void synchronized_g(T const &t)
{
  using SynchronizedG<T>;
  g(std::make_pair(t, std::mutex()));
}