Question

Je suis sûr que je connais la réponse à celle-ci (en pensant non), mais on pourrait accepter / revenir en toute sécurité std::function par valeur dans une API (à travers les limites du module)?

Je pense «non» car je ne pense pas qu'il y ait des garanties qu'un fournisseur std::function La mise en œuvre est compatible avec les autres. Est-ce le cas?

Si la réponse est non comme je le soupçonne, comment gérez-vous tous ce genre de chose? Je devrai peut-être recourir à la mise en œuvre de moi ou simplement éviter des choses comme std::function Tous ensemble (ex: travailler avec des pointeurs de fonction ou des fonctionoïdes). :-( Je me suis retrouvé à le faire dans de nombreux cas auparavant (réinventer une grande partie de la bibliothèque C ++ standard et certainement malheureusement comme même en faisant notre propre type de vecteur conforme à la STL avec la prise en charge de la gamme CTOR et du ctor de remplissage, des allocateurs personnalisés, etc. . n'était certainement pas amusant et je doute que ce soit aussi bon que des implémentations standard) simplement parce que l'on pourrait lier dynamiquement à une bibliothèque qui a, disons, la mise en œuvre de MSVC 2010 de STD :: Fonction d'un binaire écrit dans Mingw, par exemple

L'alternative, bien sûr, est de ne pas utiliser ce type de fonctionnalités C ++ dans notre API et d'utiliser, par exemple, une interface C, mais cela aurait un coût plutôt lourd pour nous car nous utilisons notre API comme API centrale pour Développement interne et tiers.

Était-ce utile?

La solution

Vous pouvez le faire, tant que tout le monde joue selon les mêmes règles, et votre bibliothèque standard est liée dynamiquement. Si des tiers savent qu'ils doivent utiliser un certain compilateur et une certaine version de ce compilateur, avec certains drapeaux de construction spécifiques, il n'y a pas de problème.

Même si vous écrivez votre propre wrapper, ils doivent utiliser une version spécifique de cet emballage, mais c'est évidemment un peu plus facile à appliquer.

Mais vraiment, c'est le prix que vous payez pour essayer d'interopérer via les DLL: tout le monde doit être sur la même longueur d'onde, sinon cela ne fonctionnera pas. Ou vous devez vous en tenir à des types de base ou à des interfaces contrôlées locales.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top