std::advanceって、どうやってBidirectionalIteratorとRandomAccessIteratorを識別してるんですか?
template<class X, class Y>で受け取っちゃってるので、さっぱり想像できません