/ / Accès à différentes structures portant le même nom - c ++, c ++ 11, boost, enums

Accès à différentes structures portant le même nom - c ++, c ++ 11, boost, enums

J'essaie d'implémenter une solution de contournement pour les versions boost qui posent des problèmes avec les énumérations étendues lors de la liaison en mode C ++ 11: voir https://svn.boost.org/trac/boost/ticket/6779 et https://svn.boost.org/trac/boost/ticket/10038

Le problème est simplement: La plupart des librairies boost pré-distribuées exposent (espaces de noms supprimés):
detail::copy_file(path const&, path const&, copy_option::enum_type, error_code*)
Mais la compilation C ++ 11 tente de trouver:
detail::copy_file(path const&, path const&, copy_option, error_code*)
en raison du fait que C ++ 98 boost utilise des enums étendus émulés, au lieu de ceux de C ++ 11.

J'ai pensé que je pourrais peut-être écrire un adaptateur pour cela, le placer dans un fichier objet propre et le lier au programme, mais j'ai échoué avec mon approche naïve:

#define copy_option native_copy_option__
#include <boost/filesystem/operations.hpp>
#undef copy_option

namespace boost {
namespace filesystem {

struct copy_option{
enum enum_type{none, fail_if_exists = none, overwrite_if_exists};
};

namespace detail {

void copy_file(const path& from, const path& to, copy_option::enum_type option, system::error_code* ec=0);

using copy_option = native_copy_option__;
void copy_file(const path& from, const path& to, copy_option option, system::error_code* ec)
{
copy_file(from, to, static_cast<boost::filesystem::copy_option::enum_type>(option), ec);
}

}  // namespace detail
}  // namespace filesystem
}  // namespace boost

Le problème est le suivant: je dois définir une fonction avec l'énumération C ++ 11 dans la signature, mais également déclarer une fonction avec l'énumération C ++ 98 qui porte le même nom.

Est-ce que c'est possible?

Réponses:

0 pour la réponse № 1

Je pense que vous devriez juste écrire du code portable.

La compilation conditionnelle de variantes "concurrentes" du code ne sollicite que Violations du règlement en ligne et de faux problèmes d’incompatibilité ABI.