LINUX.ORG.RU

История изменений

Исправление 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;
}

Так вроде работает.