En C++, la compilation du code ci-dessous:Est-il possible de "consolider" un champ de "std :: pair" sans hacks?
std::pair <int, int> x;
static_cast <std::pair <const int, int>*> (&x);
donne une erreur:
error: invalid static_cast from type ‘std::pair<int, int>*’ to type ‘std::pair<const int, int>*’
je plus ou moins comprendre pourquoi il arrive, comme cv-qualification d'un type dans une liste de paramètres de modèle peut , en principe, donne un résultat "incompatible". Et même si dans ce cas il ne le fait pas, le compilateur n'a aucun moyen de le savoir.
Quoi qu'il en soit, est-il un moyen non-hackish pour effectuer cette conversion? Je me méfie d'utiliser reinterpret_cast
pour tout ce que j'ai déjà été par des problèmes de type-punning avant. En outre, je ne peux pas utiliser de temporaires, car il s'agit d'un code critique pour les performances.
EDIT:
Voici ce que je fais. J'implémente une interface de conteneur personnalisée compatible avec std::unordered_map
. Pour cette raison, son value_type
doit être un pair <const key_type, mapped_type>
. Pour une optimisation, j'ai besoin de stocker en interne les valeurs , sans const
. Cependant, si je fais cela, je ne peux pas (sans reinterpret_cast
) implémenter des itérateurs sur le conteneur, car ils doivent renvoyer des références aux valeurs et je n'ai que des références à ces paires non-const.
Quel est votre cas d'utilisation prévu pour cela? J'ai du mal à voir comment cela serait utilisé. –
Vous pouvez conserver deux telles structures et définir une fonction de conversion du moins const à plus const. – dirkgently
@James McNellis: Je suppose qu'il a une fonction qui renvoie une paire et une autre qui prend une paire * –