2012-05-21 5 views
2

MSVC, GCC (latest), GCC 4.3 ARM 이상을 대상으로하는 새 프로젝트를 시작합니다. 우리가 빌드 한 waf 빌드 시스템에는 컴파일러의 기능 감지가 C++11 있습니다.C++ 11 Polyfills

저는 C++11을 대상으로하는 컴파일러의 모든 기능에 대한 사전 처리기 매크로를 가지고 있습니다 (예 : #ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS). 따라서 컴파일러가 지원하는 다른 코드를 컴파일 할 수 있습니다. 기능을 사용할 수 설정 기능을 구현을 사용할 수없는 경우 - GCC 거의가 모든

는 웹 개발 polyfills에 대해 생각 날 잡았어 (심지어 MSVC 11) MSVC는 근처에도없는 일을 지원합니다.

C++11은 웹 개발 polyfill만큼 간단하지는 않지만 컴파일러가 지원하지 않으면 C++ 03을 사용하여 구현할 수있는 것이 무엇입니까?

내 공용 API에서 강력하게 형식화 된 열거자를 사용하려고하지만 사실상 MyClass::MyEnumerator::EnumValueMyClass::EnumValue, C++03처럼 보일 것입니다. 거기 어쨌든 나는 같은 쉽게 C++03에서 발생하는 것으로 얻을 수 있습니다 당신은 클래스로 enum class을 에뮬레이션 할 수

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

답변

2

이것은 (포인터와 비 포인터 액세스에 대한 다른 간단한 수정을했습니다)[email protected]가 말한 것입니다. 나는 가짜 열거 형 이름을 만들어야했다. 이것은 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

정말 유익 –

1

. 귀하의 상용구 코드는 정의 내에서만 사용되지만 C++ 11 및 C++ 03에서는 사용법이 동일하며 템플릿/매크로를 사용하여 수행 할 수 있습니다. Look answer here

+0

감사합니다 - 선언 더미 열거를해야하는 메소드 매개 변수 - 그것은 내가 함께 결국 한 일 즉 –