gpt4 book ai didi

C++11 Polyfill

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:57 34 4
gpt4 key购买 nike

我正在开始一个新项目,目标是 MSVCGCC(最新)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 开发 polyfill 简单,但是如果编译器不支持,我可以用 C++03 简单地实现什么吗?

这归结为我想在我的公共(public) API 中使用强类型枚举器,但作用域 MyClass::MyEnumerator::EnumValue 看起来更像 MyClass::EnumValueC++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 :(

最佳答案

这就是您需要做的(我对指针和非指针访问进行了其他琐碎的修复)。基本上,这就是@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
}

关于C++11 Polyfill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681833/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com