检查表达式是否为“constexpr”

时间:2017-05-24 00:58:49

标签: c++ c++11

C ++ 17添加了constexpr if(如果条件是constexpr则选择是否编译语句)http://en.cppreference.com/w/cpp/language/if

在C ++ 11中是否有模仿这种结构的有限形式的技巧?

如果在宏中需要以下构造:

  #define ALLOCATE(x) if ({x is a constant}) allocate_n<x>() else allocate(x)

2 个答案:

答案 0 :(得分:3)

假设您正在使用GCC或Clang,您可以使用__builtin_constant_p()扩展程序:

#define ALLOCATE(x) \
    __builtin_constant_p(x) \
        ? allocate_n<__builtin_constant_p(x) ? x : 0>() \
        : allocate(x)

See it live on Coliru

答案 1 :(得分:2)

  

在C ++ 11中是否有模仿这种结构的有限形式的技巧?

我能想象的最好的是替代

if constexpr ( cond ) statment-1 else statement-2;

foo<cond>( /* ? */ );

其中foo()的定义如下

template <bool>
void foo (/* ? */);

template <>
void foo<true> (/* ? */)
 { /* statement-1 */ }

template <>
void foo<false> (/* ? */)
 { /* statement-2 */ }