3

、、などを対象MSVCとした新しいプロジェクトを開始しています。私たちが構築したビルドシステムには、コンパイラの機能検出機能があります。GCC (latest)GCC 4.3 ARMwafC++11

C++11これで、たとえば、ターゲットにしているコンパイラのすべての機能のプリプロセッサマクロができました#ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS。したがって、コンパイラがサポートするものに合わせてさまざまなコードをコンパイルできます。GCCほぼサポートしているので、すべてが近くにありMSVCません(MSVC11でも)

これにより、Web開発ポリフィルについて考えるようになりました。機能が利用できない場合は、利用可能な機能セットを使用して実装してください。

これは、Web開発ポリフィルほど単純でC++11はありませんが、コンパイラーがサポートしていない場合、C ++ 03で簡単に実装できるものはありますか?

これは、パブリックAPIで強く型付けされた列挙子を使用したいという事実に要約されますが、スコープMyClass::MyEnumerator::EnumValueはのようMyClass::EnumValueになりC++03ます。とにかく私は同じことをC++03簡単に起こさせることができますか?

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 :(
4

2 に答える 2

4

これはあなたがする必要があることです(私はポインタと非ポインタアクセスに関して他の些細な修正をしました)。基本的に、それは@demiが言ったことです。ダミーの列挙型の名前を作成する必要がありました。これは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
}
于 2012-05-21T15:02:46.747 に答える
1

enum classクラスとしてエミュレートできます。ボイラープレートコードは定義のみになりますが、使用法はC++11とC++03で同じであり、テンプレート/マクロを使用して実行できます。ここで答えを見てください

于 2012-05-21T08:45:26.033 に答える