Notez que la forme présentée ici n'a pas été acceptée dans la norme, comme indiqué ci-dessous.
Moment de la compilation, traitement de chaîne est deviné à devenir possible à travers définis par l'utilisateur littéraux proposé dans N2765.
Comme je l'ai déjà mentionné, je ne sais pas du tout compilateur qui implémente actuellement et sans prise en charge du compilateur il ne peut être que du domaine de la conjecture.
Dans le §2.13.7.3 et 4 du projet de nous avons les éléments suivants:
Autre (S contient un littéral de l'opérateur modèle), L est traité comme un appel de la forme
l'opérateur "" X< "c1", "c2', ... , 'ck'>()
où n est la source de la séquence de caractères c1c2...ck. [Note: La séquence c1c2...ck peut
ne contient que des caractères à partir de la source de base de jeu de caractères. -la note de fin]
Combinez cela avec constexpr
et nous devrions avoir le temps de compilation de la chaîne de traitement.
mise à jour: j'ai oublié que je lisais le mauvais point, ce formulaire est autorisé définies par l'utilisateur-entier-littéraux et flottant littéraux, mais apparemment pas pour cordes-littéraux (§2.13.7.5).
Cette partie de la proposition semble ne pas avoir été accepté.
Cela étant dit, avec mon peu de aperçu de C++0x, il pourrait ressembler à quelque chose comme ceci (j'ai probablement eu quelque chose de mal):
template<char c, char... str>
struct hash {
static const unsigned result = c + hash<str...>::result;
};
template<char c>
struct hash {
static const unsigned result = c;
};
template<char... str>
constexpr unsigned
operator "" _hash() {
return hash<str>::result;
}
// update: probably wrong, because the above
// form is not allowed for string-literals:
const unsigned h = "abcd"_hash;
Si Jerrys approche fonctionne, alors le suivant devrait fonctionner, cependant:
constexpr unsigned operator "" _hash(const char* s, size_t) {
return const_hash(s);
}