Так не получится. Оно же требует такого синтаксиса:
ClassInstance.operator[]<EnumInstance>(number)
Но должно быть можно сделать небольшой wrapper, который бы позволил писать так:
w<EnumInstance>(ClassInstance)[number]
// или так (писать удобнее, но скобки мешаются при чтении)
ClassInstance.w<EnumInstance>()[number]
Где тип/результат вызова w просто передаёт шаблонный аргумент через правильный
синтаксис. Правда, для получения правильных типов без хардкода будет нужен C++11.