template<typename X_CONTAINER, typename Y_CONTAINER>
class base {
 struct _vec_type{};
 struct _lst_type{};

 struct _x { std::list<_y*> ylist; typedef X_CONTAINER container_type; };
 struct _y { std::list<_x*> xlist; typedef Y_CONTAINER container_type; };

 // 要素x,yについて型とコンテナタイプを設定
 template<typename T, typename CONTAINER> struct _container_gen {};
 template<typename T> struct _container_gen<T,_vec_type> { typedef std::vector<T> type; };
 template<typename T> struct _container_gen<T,_lst_type> { typedef std::list<T> type; };
 typedef typename _container_gen<_x, X_CONTAINER>::type _xset;
 typedef typename _container_gen<_y, Y_CONTAINER>::type _yset;

 // 要素の集まり
 _xset xset;
 _yset yset;

 // n番目の要素を返す関数
 template<typename T>
 T element_forward__dispatch(T begin, int n, _vec_type) {
  return begin+n; // vector<>の場合はランダムアクセスで
 }
 template<typename T>
 T element_forward__dispatch(T begin, int n, _lst_type) {
  while (n) { ++begin; --n; } // list<>の場合はインクリメントで
  return begin;
 }
 template<typename T>
 T element_forward(T begin, int n) {
  typename T::container_type container;
  return element_forward__dispatch(begin,n,container);
 }
};

//使い方
base<_vec_type, _lst_type> a(100,100);
_x x = a.element_forward(xset,10); // 速い
_y y = a.element_forward(yset,10); // 遅い