Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11多填料_C++_C++11_Feature Detection_Waf - Fatal编程技术网

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
}

这就是我的结论-方法参数声明需要有伪枚举