Вы можете создать общий шаблон для массива:
template <class TElem, int size = 0>
class pointer
{
// stuff to represent an array pointer
};
Тогда частичная специализация:
template <class TElem>
class pointer<TElem, 0>
{
// completely different stuff for a non-array pointer
};
Определив специализированную версию для случая, когда size = 0, вы можете фактически дать ей совершенно другую реализацию, но с тем же именем.
Однако, может быть, будет понятнее просто дать ему другое имя.