3

我正在开始一个新项目,该项目将针对MSVCGCC (latest)GCC 4.3 ARM。我们构建的waf构建系统具有C++11编译器的功能检测。

C++11例如,我现在有针对编译器中所有功能的预处理器宏#ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS。因此,我可以针对编译器支持的内容编译不同的代码。几乎GCC支持它MSVC甚至还没有接近(即使有MSVC11 个)

这让我想到了 Web 开发 polyfill——如果该功能不可用,则使用可用的功能集实现它。

这不像 web 开发 polyfill 那样简单,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

这就是你需要做的(我对指针和非指针访问做了其他简单的修复)。Bsically,这就是@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 回答