階層がフラットである必要がない場合:
#include <iostream>
#include <iomanip>
#include <type_traits>
template<size_t N> struct X : X<N - 1> {};
template<> struct X<0> {};
template<size_t N>
struct Y : X<N - 1> {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_base_of<X<0>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<1>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<2>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<3>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<4>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<5>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<6>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<7>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<8>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<9>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<10>, Y<10>>::value << "\n"; // false
}
http://ideone.com/wsgAhQでオンライン デモを参照してください。