I ended up with this interface, where a Number
of -1 fails at compile time based on an implementation detail in my class. Such that you must specify a valid Number
.
template<typename T, size_t Number = -1>
class Foo {};
template<typename T>
class Foo<T, -1> {};
template<typename T, size_t Size, size_t Number>
class Foo<T[Size], Number> {};
template<typename T, size_t Number>
class Foo<T[], Number> {};
template<typename T>
class Foo<T[], -1> {};