Неудобства с template-перегрузками

 

Довольно часто сталкиваюсь с неудобством, которое проще всего показать на примере:

#property strict

struct STRUCT
{
  int Tmp;
};

class CLASS
{
private:
  int Tmp[];
  
public:
  const int operator []( const int Pos ) const
  {
    return(this.Tmp[Pos]);
  }
};

template <typename T>
void Func1( const T &Input )
{
  // Очень большое тело, где идет только чтение (не запись - const !!!) Input[Pos]
   
  return;
}

template <typename T>
void Func2( const T &Input[] ) // Единственное отличие от Func1 - наличие [] в определении
{
  // Тело(Func1)
   
  return;
}

void OnStart( void )
{
  STRUCT Struct[];
  CLASS Class;
  
  Func1(Class);
  Func2(Struct); // Func1(Struct) - нельзя: "parameter conversion not allowed"
  
  // Если бы вместо Func1 и Func2 было бы достаточно один раз написать Func( const T &Input )...
  // А пока либо копи-паста (и без фолдинга) большого тела Func1 в Func2 (еще и template-перегрузки нет),
  // либо написание соответствующего чудовищного #define-тела (с невозможностью отладки).
  
  // Иметь бы возможность увидеть исходник перед компиляцией, где все шаблоны и макросы уже раскрыты и вставлены.
  // Тогда можно было бы делать соответствующие точки останова и, соответственно, проводить более четкую отладку.

  return;
}

 Как решаются подобные ситуации, чтобы не через одно место?