История изменений
Исправление Pavval, (текущая версия) :
#include <iostream>
using namespace std;
template <typename T>
class is_ptr
{
};
template <typename T>
class is_ptr<T*>
{
public:
enum { good };
};
template <int Size, typename T>
int getArrayLength(T (&s)[Size])
{
return Size;
}
template<int Size, typename T>
int getArrayLength(T s)
{
is_ptr<T>::good;
return Size;
}
int main() {
const int a[100] = {0};
int* b = new int[50];
cout << getArrayLength(a) << endl;
cout << getArrayLength<20>(a) << endl;
cout << getArrayLength<50>(b) << endl;
cout << getArrayLength<100>(a) << endl;
return 0;
}
Так вроде работает. Еще можно заюзать стандартные type_traits, но IMHO будет более многословно.
Исходная версия Pavval, :
#include <iostream>
using namespace std;
template <typename T>
class is_ptr
{
};
template <typename T>
class is_ptr<T*>
{
public:
enum { good };
};
template <int Size, typename T>
int getArrayLength(T (&s)[Size])
{
return Size;
}
template<int Size, typename T>
int getArrayLength(T s)
{
is_ptr<T>::good;
return Size;
}
int main() {
const int a[100] = {0};
int* b = new int[50];
cout << getArrayLength(a) << endl;
cout << getArrayLength<20>(a) << endl;
cout << getArrayLength<50>(b) << endl;
cout << getArrayLength<100>(a) << endl;
return 0;
}
Так вроде работает.