2012-05-21 2 views
2

Je commence un nouveau projet qui ciblera MSVC, GCC (latest), GCC 4.3 ARM et plus. Le système de construction waf que nous avons construit a la fonction de détection de C++11 du compilateur.C++ 11 Polyfills

J'ai maintenant des macros de préprocesseur pour toutes les fonctionnalités du compilateur que je cible pour C++11, par exemple #ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS. Je peux donc compiler un code différent pour ce que le compilateur supporte. Comme GCC soutient presque tout être MSVC est même pas proche (même avec MSVC 11)

Cela me fait penser à développement web polyfills - si la fonction n'est pas disponible avec la mise en œuvre de la fonction mis disponible.

Ce n'est pas aussi simple que les polyfills de développement Web que pour C++11 mais est-ce qu'il y a quelque chose que je peux simplement implémenter avec C++ 03 si le compilateur ne le supporte pas?

Cela se résume au fait que je veux utiliser les agents recenseurs fortement typés dans mon API publique, mais la portée MyClass::MyEnumerator::EnumValue ressemblera plus à MyClass::EnumValueC++03. Y at-il de toute façon je peux obtenir le même de se produire dans C++03 facilement:

class MyClass { 
    public: 
#ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS 
     enum class MyEnumerator : unsigned int { 
#else 
     enum MyEnumerator { 
#endif 
      EnumValue = 0 
     } 
    void method(MyEnumerator e); 
} 

MyClass mc = new MyClass(); 
mc.method(MyClass::MyEnumerator::EnumValue) // C++11 
mc.method(MyClass::EnumValue)    // C++03 :(

Répondre

2

C'est ce que vous devrez faire (j'ai fait d'autres corrections triviales sur les pointeurs et l'accès sans pointeur). Du point de vue des choses, c'est ce que @demi a dit. J'ai dû faire un nom enum enum. Cela fonctionne en g ++ - 4.7.

class MyClass { 
    public: 
#if __cplusplus > 201000 
     enum class MyEnumerator : unsigned int { 
      EnumValue = 0 
     }; 
    void method(MyEnumerator e) {} 
#else 
     class MyEnumerator { 
     public: 
      enum Dummy { 
      EnumValue = 0 
      }; 
     }; 
    void method(MyEnumerator::Dummy e) {} 
#endif 
}; 

int main() { 
    MyClass mc; 
    mc.method(MyClass::MyEnumerator::EnumValue); // C++11 or C++03 
} 
+0

Voilà ce que j'ai fini avec - la déclaration paramètre de méthode doit avoir le mannequin ENUM –

1

Vous pouvez émuler enum class en classe. Votre code passe-partout sera seulement en définition, mais l'utilisation sera la même pour C++ 11 et C++ 03, et peut être fait avec des modèles/macros. Look answer here

+0

Merci pour le lien - il est très instructif –