我正在开始一个新项目,目标是MSVC
, GCC (latest)
, GCC 4.3 ARM
和更多。这waf
我们已经构建了构建系统C++11
编译器的功能检测。
我现在拥有针对我目标的编译器中所有功能的预处理器宏C++11
, 例如#ifdef WAF_FEATURE_CXX_STRONGLY_TYPED_ENUMS
。因此,我可以根据编译器支持的内容编译不同的代码。作为GCC
几乎支持这一切MSVC
甚至不接近(即使MSVC
11)
这让我开始考虑 Web 开发 Polyfills - 如果该功能不可用,请使用可用的功能集来实现它。
这远不像 Web 开发 Polyfill 那么简单C++11
但是如果编译器不支持的话,我可以用 C++03 简单地实现什么吗?
这归结为这样一个事实:我想在我的公共 API 中使用强类型枚举器,但范围界定MyClass::MyEnumerator::EnumValue
会看起来更像MyClass::EnumValue
in C++03
。无论如何我可以让同样的事情发生在C++03
easily:
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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)