Comment puis-je diffuser un boost::shared_array<char>
en boost::shared_array<const char>
?Cast booster :: shared_array <char> pour booster :: shared_array <const char>
Répondre
Depuis shared_array
n'a pas de méthode add_ref
, vous pouvez l'imiter comme suit:
struct MagicDeleter {
MagicDeleter(boost::shared_array<char> ptr) : ptr(ptr) {};
template<typename T> void operator()(T*) {}
protected:
boost::shared_array<char> ptr;
};
...
boost::shared_array<char> orig_ptr(some_val);
boost::shared_array<const char> new_ptr(orig_ptr.get(), MagicDeleter(orig_ptr));
Très intelligent. Agréable :) – Catskul
Vous ne pouvez pas. Comme les deux types sont basés sur un modèle, les deux types sont complètement différents pour le compilateur.
Un tel moulage généré par un compilateur ne peut pas être possible.
Les composants internes de la classe avec le paramètre de modèle const-qualified peuvent différer considérablement de la classe sans un, en raison de la fonction de spécialisation de modèle.
En outre, l'utilisation de cette fonctionnalité est parfois un arrière-plan pour les vérifications de compilation qui ne permettent simplement pas l'instanciation du type A<const T>
pour tous les cas où le type A<T>
est correct.
Pas possible? Pourtant, boost :: shared_ptr supporte la conversion implicite des types dérivés en base (et non-const en const) et toutes sortes de conversions. –
Il supporte en effet * conversion *. Mais il ne peut pas être * casté *. –
Il supporte les lancers, à moins que vous ne vouliez dire autre chose entièrement. Par exemple, 'boost :: shared_ptr
Je pense que vous ne pouvez pas. Au cas où vous en auriez vraiment besoin, vous pouvez créer une classe personnalisée smart-pointer. Des conseils pour cela peuvent être trouvés here.
Les autres réponses sont correctes, vous ne pouvez pas et vous ne devriez pas.
En outre, êtes-vous sûr de vouloir un boost::shared_array<const char>
et non un const boost::shared_array<char>
?
Pratiquement, cela fonctionne:
boost::shared_array<char> acz;
boost::shared_array<const char>& acz2 = reinterpret_cast< boost::shared_array<const char>& >(acz);
mais il est pas une bonne idée et ne fonctionne que si boost :: shared_array et boost :: shared_array ont la même mise en œuvre. Les modèles peuvent être partiellement spécialisés:
template<class T>
struct TwoImplementations {
int m_nIntMember;
};
template<>
struct TwoImplementations< const T > {
double m_fDoubleMember;
};
Faire un jeté entre TwoImplementations<int>
réinterpréter et TwoImplementations<const int>
est tout simplement faux.
N'utilisez jamais un tel reinterpret_cast, surtout dans ce cas! De manière générale, reinterpret_cast est 99% non portable. – rmn
Je le sais et le reconnais dans mon post. Alors s'il vous plaît ne pas downvote. C'est une caractéristique du langage, ça peut marcher et dans 1% des cas, ça peut même être utile. – Sebastian
@rmn: Une taille ne convient pas à tous, je suis d'accord que dans ce lieu c'est une mauvaise idée, mais ne jamais dire jamais. –
Vous pouvez utiliser la méthode get() pour obtenir le caractère char * sous-jacent, qui est automatiquement convertible en un const char *, mais ne l'attribuez pas à un autre shared_array, car les données seront supprimées deux fois. Utilisez-le simplement comme vous en avez besoin.
comme ceci:
boost::shared_array<char> x(new int[13]);
const char *y = x.get();
Je ne l'aurais pas pensé à cela sans réponse impressionnante de Kirill, mais vous pouvez étendre effectivement boost static_pointer_cast
qui est utilisé pour shared_ptr
s de travailler sur shared_array
s comme tel:
template<typename OriginalType>
struct SharedPtrCastHelper
{
public:
SharedPtrCastHelper(const OriginalType & ptr) : ptr(ptr) {};
template<typename T> void operator()(T*) {}
protected:
OriginalType ptr;
};
template<typename OutT, typename InT>
boost::shared_array<OutT>
static_pointer_cast(const boost::shared_array<InT> & inSharedPtr)
{
typedef SharedPtrCastHelper<boost::shared_array<InT> > Helper;
return boost::shared_array<OutT>((OutT*)inSharedPtr.get(),
Helper(inSharedPtr));
}
avec que vous pouvez faire quelque chose comme:
boost::shared_array<int> intArrayPtr(new int[40]);
boost::shared_array<unsigned int> uintArrayPtr;
uintArrayPtr = static_pointer_cast<unsigned int>(intArrayPtr);
- 1. réaffectation boost :: shared_array
- 2. Argument Pointer pour booster python
- 3. Booster adjacency_list help needed
- 4. lien pour booster regex dans gcc
- 5. (simple) booster thread_group question
- 6. booster asio et endian
- 7. Utiliser le code d'Eclipse pour booster
- 8. timestamp unix pour booster :: posix_time :: ptime
- 9. booster static_assert avec un message?
- 10. booster le problème de compilation fractionnée
- 11. Comment faire pour booster les threads d'auto-destruction? (C++)
- 12. fonction membre modélisé pour booster le conteneur multi-index
- 13. C++: définir <customClasS * comment surcharger l'opérateur <(const customClass & * ...)?
- 14. Générique <T> comment cast?
- 15. Cast "vide const *" à "const char *"
- 16. champ <t> cast invalide
- 17. "booster" différentes instances du même champ dans un document lucene
- 18. booster socket asio se termine après l'envoi de certains msgs
- 19. Comment booster la réplication maître-esclave MySQL à l'extrême?
- 20. Comment utiliser boost :: object_pool <> :: construct avec une référence non const comme paramètre ctor?
- 21. boost :: shared_ptr <const T> pour boost :: shared_ptr <T>
- 22. Avec IEEE-754, 0 <ABS (const) <1, est-ce que (x/const) * const garantit de renvoyer des résultats distincts pour des valeurs distinctes de X?
- 23. La liste <TEntity> .Cast <BusinessObject>() échoue lorsque la distribution implicite existe
- 24. Cast a reçu objet à une liste <object> ou IEnumerable <object>
- 25. Pourquoi ne pas les chaînes.Cast <object> cast Liste <string> à la liste <object>?
- 26. Cast IEnumerable <T> à ObservableCollection <T> sans injection de constructeur l'IEnumerable <T>
- 27. Cast/Convert IEnumerable <T> à IEnumerable <U>?
- 28. Impossible de taper cast <AnonymousType # 1> à <WindowsFormsApplication1.Attributes> [C# 3.0]
- 29. opérateur <<: std :: cout << i << (i << 1);
- 30. Résultats Cast linq à la liste <MyInterface>
Pourquoi pensez-vous que vous avez besoin de faire cela? –