【问题标题】:C++11 PolyfillsC++11 填充物
【发布时间】:2012-05-21 08:30:55
【问题描述】:

我正在开始一个新项目,目标是MSVCGCC (latest)GCC 4.3 ARM 等等。我们搭建的waf构建系统有C++11编译器的特征检测。

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

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

这绝不是像 C++11 那样简单的 web 开发 polyfills,但是如果编译器不支持它,我可以用 C++03 简单地实现什么吗?

这归结为我想在我的公共 API 中使用强类型枚举器,但MyClass::MyEnumerator::EnumValue 的作用域看起来更像C++03 中的MyClass::EnumValue。无论如何我可以很容易地在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 :(

【问题讨论】:

    标签: c++ c++11 feature-detection waf


    【解决方案1】:

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

    【讨论】:

    • 这就是我最终得到的结果 - 方法参数声明需要有虚拟枚举
    【解决方案2】:

    你可以模仿 enum class 作为类。您的样板代码仅在定义中,但 C++11 和 C++03 的用法相同,并且可以使用模板/宏来完成。 Look answer here

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 1970-01-01
      • 2017-04-04
      • 2019-01-16
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多