Можно как-то намекнуть компилятору, что нужно использовать вторую функцию если темплейтоаргумент указан?
#include <iostream>
using namespace std;
template <int Size, typename T>
int getArrayLength(T (&s)[Size]) {
return Size;
}
template<int Size, typename T>
int getArrayLength(T* s) {
return Size;
}
int main() {
int a[100];
int* b = new int[50];
cout << getArrayLength(a) << endl; // 100 -- первая функция
cout << getArrayLength<20>(a) << endl; // 20 -- вторая функция
cout << getArrayLength<50>(b) << endl; // 50 -- вторая функция
cout << getArrayLength<100>(a) << endl; // ошибка -- муки выбора
return 0;
}