This is not a complete answer, but it is too heavy to fit into a comment. To access ComboFour subobjects, if you really want to make the latter, you need the following ugly syntax:
ComboFour<int, 2, float, 1> cf; cf.Array<int, 2>::data[0] = 0; cf.Array<int, 2>::data[1] = 1; cf.Array<float, 1>::data[0] = 2.0f;
You might be able to clear this with some accessor functions, but still it would not be so.
The big problem, however, is this:
ComboFour<int, 1, int, 1> cf2
because the same class cannot be used as a parent twice.
(In addition, the note, Array<T, 0> ComboFour subobjects may or may not accept zero space, this is called "empty base optimization" and is permitted, but not necessarily, by the standard.)
There is probably some way around the second problem ... I think that inheritance from std::tuple<...> (which may or may not be possible using empty database optimization inside your standard library implementation) Array<T, N> is perhaps the easiest way to do this if you really need to, but it will make the syntax even uglier.
EDIT : this works for me on GCC 4.7.2
template< class T1, unsigned short N1, class T2, unsigned short N2, class T3, unsigned short N3 > struct Combo : std::tuple<Array<T1, N1>, Array<T2, N2>, Array<T3, N3>> { };
and later ...
Combo<int, 2, int, 2, float, 3> c; std::get<0>(c).data[0] = 0; std::get<0>(c).data[1] = 1; std::get<1>(c).data[0] = 2; std::get<1>(c).data[1] = 3; std::get<2>(c).data[0] = 0.0; std::get<2>(c).data[1] = 1.0; std::get<2>(c).data[2] = 2.0; assert(sizeof(Combo<int, 0, int, 0, float, 1>) == sizeof(float));
(Honestly, the standard library more or less requires empty database optimization to be usable, so although it is not required, I would be surprised if some recent compiler did not support it, whether or not std::tuple<...> in writing for the proper use of this optimization is another matter.)