C++ C++;11多填料
我正在启动一个新项目,目标是C++ C++;11多填料,c++,c++11,feature-detection,waf,C++,C++11,Feature Detection,Waf,我正在启动一个新项目,目标是MSVC,GCC(最新版本),gcc4.3 ARM等等。我们构建的waf构建系统具有C++11编译器的功能检测 我现在有了编译器中所有功能的预处理器宏,我的目标是C++11,例如#ifdef WAF\u FEATURE\u CXX\u strong\u TYPED\u ENUMS。因此,我可以编译编译器支持的不同代码。由于GCC几乎支持这一切,因此MSVC甚至不接近(即使使用MSVC11) 这让我想到了web开发——如果功能不可用,请使用可用的功能集实现它 这远没有C
MSVC
,GCC(最新版本)
,gcc4.3 ARM
等等。我们构建的waf
构建系统具有C++11
编译器的功能检测
我现在有了编译器中所有功能的预处理器宏,我的目标是C++11
,例如#ifdef WAF\u FEATURE\u CXX\u strong\u TYPED\u ENUMS
。因此,我可以编译编译器支持的不同代码。由于GCC
几乎支持这一切,因此MSVC
甚至不接近(即使使用MSVC
11)
这让我想到了web开发——如果功能不可用,请使用可用的功能集实现它
这远没有C++11
的web开发那么简单,但是如果编译器不支持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++11和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
}
这就是我的结论-方法参数声明需要有伪枚举