2016-07-27 66 views
1

project中,我使用CMake模块WriteCompilerDetectionHeader来检测C++ 11功能是否可用。该模块为static_assert等功能生成兼容性实现的文件:如果该功能可用,则为该功能声明的宏扩展为该功能;否则它会扩展到一些退步。C++ 11 constexpr兼容性实现

功能constexpr没有兼容性实现。我试图提供一个,最后实现了一个双重实现:一个用于constexpr变量,另一个用于constexpr函数。

在cmake的文件:

write_compiler_detection_header(
    FILE "${CMAKE_CURRENT_BINARY_DIR}/foo-compilerdetection.h" 
    PREFIX Foo 
    COMPILERS 
     GNU 
     MSVC 
    FEATURES 
     cxx_constexpr 
) 

在全局头:

#include "foo-compilerdetection.h" 

#ifdef Foo_COMPILER_CXX_CONSTEXPR 
# define Foo_CONSTEXPR_FUNCTION constexpr 
# define Foo_CONSTEXPR_OBJECT constexpr 
#else 
# define Foo_CONSTEXPR_FUNCTION inline 
# define Foo_CONSTEXPR_OBJECT const 
#endif 

所以对于constexpr将与预选赛const更换和功能将与预选赛inline替代变量。

这些替换是否合适?其他限定符或组合或限定符是否更适合变量和函数?

+1

'难道这些替代adequat?'这取决于你如何使用那些'constexpr'函数/变量;如果你使用'constexpr'函数的结果作为模板参数,'inline'不足以支持 –

+0

在C++ 11中,constexpr成员函数也是const。但是,C++ 14并不是这样。 – Dutow

回答

0

我认为这并不是那么简单。在编译期间计算constexprconstinline都没有。

我会说,对于constexpr变量,您必须考虑两种可能性:const(您使用过)和预处理器宏(即#define PI 3.14)。在尊重范围,调试等方面很有用,而另一个则是严格编译时。

当涉及到constexpr功能它有点棘手。这样的功能可以在编译时计算,但不一定。如果你正在追求编译时评估,你应该考虑模板和预处理器(我知道宏是邪恶的,但...)。如果我们正在讨论在运行时应该评估的功能,那么内联或模板是最好的选择。

预处理器宏是我知道的为constexpr唯一的替代可以在switch语句中使用(如case标记),或在数组分配(int tab[5];