Хитрость в специализации:
#include <iostream>
template <typename T>
struct is_pointer {
enum { value = 0 };
};
template <typename T>
struct is_pointer<T*> {
enum { value = 1 };
};
template <typename T>
bool ptr_test(const T&) {
return is_pointer<T>::value;
}
int main() {
int *ptr;
const int *ptr2;
int a;
double b;
std::cout << "ptr:" << ptr_test(ptr) << std::endl;
std::cout << "ptr2:" << ptr_test(ptr2) << std::endl;
std::cout << "a:" << ptr_test(a) << std::endl;
std::cout << "b:" << ptr_test(b) << std::endl;
}
(работает как положено в CentOS 5.3, с gcc 4.1.2)