Je veux faire un équivalent à boost::swap
et dans mon environnement, les en-têtes standard peuvent, ou ne peuvent pas être inclus. Selon la licence du projet et d'autres choses.
Je voudrais faire des parties du code protégées par des détecteurs de garde:Existe-t-il un moyen de détecter de façon portative qu'un en-tête standard est inclus en utilisant des macros?
Considérons une unité de compilation.
projet spécifique, le potentiel ci-écrit comprend:
#include <algorithm> // (or <utility> for C++11 projects)
plus tard dans le code du projet inclus de mon en-tête de service d'échange:
namespace MyCompany
{
template<class T1, class T2>
void swap(T1& left, T2& right)
{
#ifdef _ALGORITHM_ // you get the idea.
std::swap(left, right);
#else
// fallback impl
#endif
}
}
J'ai simplifié parce que nous ne parlons pas de détails de l'affaire ADL ici, mais il sera inclus.
ici pour la référence de ce dont je parle, mais cela n'a aucune importance à cette question:
http://www.boost.org/doc/libs/1_57_0/boost/core/swap.hpp
Donc, cette question est sur le point, comment puis-je détecter l'inclusion d'en-tête standard? le gardien _ALGORITHM_
est présent dans l'en-tête visual studio fourni, mais je n'ai lu nulle part sur http://www.cplusplus.com/reference/algorithm/ qu'il devrait avoir n'importe quelle macro que je peux vérifier.
(note finale: cette question est un peu XY peu biaisée Ce que je veux vraiment est de détecter la présence de la fonction std::swap
, pas l'en-tête..)
Donc, vous voulez l'inverse? Utiliser un échange spécialisé comme solution de repli? –
disons, comme une convention, les clients de notre codebase utiliseront MyCompany :: swap comme fonction d'échange par défaut, les mêmes utilisateurs de stimuler la façon dont ont largement adopté boost :: échange. Cependant, l'implémentation de ce swap spécial, pourrait utiliser std :: swap en interne dans le cas où les types T1 et T2 étant permutés ont une spécialisation de std :: swap. Mais si les en-têtes standard ne sont pas inclus à ce stade (parce que mon utilitaire ne les inclura pas en raison du respect des règles de licence plus strictes), je veux le détecter et ne jamais appeler std :: swap. –
Je respecte votre intention mais cela conduit à des bogues difficiles à traquer à long terme; le code du client peut silencieusement changer de comportement en fonction ou non '' #include, et vous devrez traiter les demandes de support client –