C ++ 11 constexpr兼容性实现

时间:2016-07-27 09:02:46

标签: c++11

project中,我使用CMake模块WriteCompilerDetectionHeader来检测C ++ 11功能是否可用。该模块生成一个文件,其中包含static_assert等某些功能的兼容性实现:如果该功能可用,则为该功能声明的宏将扩展为该功能;否则会扩大到一些后备。

功能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 个答案:

答案 0 :(得分:0)

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

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

说到constexpr函数,它有点棘手。这样的函数可以在编译时计算但是没有必要。如果你正在进行编译时评估,你应该考虑模板和预处理器(我知道宏是邪恶的但是......)。如果我们正在讨论应该在运行时进行评估的函数,那么内联或模板是最好的选择。

预处理器宏是我所知道的constexpr的唯一替换,可以在switch语句(作为case标签)或数组分配(int tab[5];)中使用< / p>