les bases du C++ 0x std::is_pointer
pourrait fonctionner:
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;
};
pour cet exemple, nous ne voulons pas avoir à utiliser le type, donc nous avons besoin d'une déduction argument modèle:
template <typename T>
bool is_pointer(const T &) {
return is_pointer_helper<T>::value;
}
Et nous avons fini:
if (is_pointer(pa)) {
pa[0] = 1;
} else {
pa = 1;
}
MAIS, notez que ce code encore ne compilera pas moins pa[0] = 1
et pa = 1
sont les deux expressions valides (et pour ne double
ni double*
sont-ils tous les deux valides - Si vous définissez à 0
alors les deux seraient valides pour double*
, mais toujours seulement la seconde pour double
). Alors sans doute ce que vous voulez est pas explicite « si » test, mais une fonction surchargée:
template <typename T>
void set_thingy(T &t) {
t = 1;
}
template <typename T>
void set_thingy(T *pt) {
set_thingy(*pt);
}
set_thingy(pa);
Ou, puisque pa
est toujours double
ou double*
, il n'y a pas besoin de se concentrer sur le fait que l'on est un pointeur et l'autre ne l'est pas, ils ne sont que deux types différents que nous devons traiter différemment.Donc, pas besoin de modèles:
void set_thingy(double &d) { d = 1; }
void set_thingy(double *p) { *p = 1; }
set_thingy(pa);
Cela peut probablement être fait à la compilation avec des modèles. La question est: pourquoi? Vous devriez faire ceci * partout * que vous avez l'intention d'utiliser 'pa'. Quelle situation nécessite cela? –
La notion de C++ étant un langage dynamique est intéressante. Je veux m'abonner à votre lettre d'information. –
Qu'est-ce que vous ** essayez vraiment de faire? Les façons dont 'pa' est déclaré ailleurs dans le programme sont totalement sans rapport avec la façon spécifique dont il est déclaré dans le contexte de l'instruction if. –