我正在开始一个新的项目,目标是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 -如果特性不可用,就用可用的特性集来实现它。
这远不像C++11那样简单,但是如果编译器不支持的话,有没有什么东西可以简单地用C++03实现呢?
归根结底,我希望在公共MyClass::MyEnumerator::EnumValue中使用强类型枚举器,但作用域API看起来更像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 :(发布于 2012-05-21 23:02:47
这就是你需要做的(我做了其他关于指针和非指针访问的简单修复)。简单地说,这就是@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-21 16:45:26
您可以将enum class模拟为类。您的样板代码只是在定义上,但对于C++11和C++03的用法是相同的,并且可以使用模板/宏来完成。Look answer here
https://stackoverflow.com/questions/10681833
复制相似问题