Основы работы C ++ 0x std::is_pointer
:
template <typename T>
struct is_pointer_helper {
static const bool value = false;
};
template <template T>
struct is_pointer_helper<T*> {
static const bool value = true;
};
Для этого примера нам не нужно использовать тип, поэтому нам нужно некоторое вычитание аргумента шаблона:
template <typename T>
bool is_pointer(const T &) {
return is_pointer_helper<T>::value;
}
И все готово:
if (is_pointer(pa)) {
pa[0] = 1;
} else {
pa = 1;
}
НО, обратите внимание, что этот код по-прежнему не будет компилироваться, если только pa[0] = 1
и pa = 1
не являются допустимыми выражениями (и ни для одного из нихdouble
и double*
они оба действительны - если вы устанавливаете 0
, то оба значения будут действительны для double*
, но все равно только секунда для double
).Поэтому, вероятно, вам нужен не явный тест «если», а перегруженная функция:
template <typename T>
void set_thingy(T &t) {
t = 1;
}
template <typename T>
void set_thingy(T *pt) {
set_thingy(*pt);
}
set_thingy(pa);
Или, поскольку pa
всегда равен double
или double*
, нет необходимости фокусироваться натот факт, что один является указателем, а другой - нет, это просто два разных типа, к которым мы должны относиться по-разному.Поэтому нет необходимости в шаблонах:
void set_thingy(double &d) { d = 1; }
void set_thingy(double *p) { *p = 1; }
set_thingy(pa);