编译constness的时间检查

时间:2014-07-13 15:24:32

标签: c++ templates template-meta-programming compile-time compile-time-constant

如果我有一个功能

int calcStuff_dynamic(const int a, const int b)

和一些模板元代码

template<int a, int b>
struct calcStuff_static {
    static const int value = //some more code
};

有没有办法写一个包装器

int calcStuff(const int a, const int b) {
    IF_THESE_ARE_KNOWN_CONSTANTS_AT_COMPILE_TIME(a, b)
        return calcStuff_static<a, b>::value;
    ELSE_TEMPLATE_WOULD_FAIL
        return calcStuff_dynamic(a, b);
}

2 个答案:

答案 0 :(得分:1)

你不能这样做,但它将由智能编译器完成。

也许首先想到的解决方案是将 SFINAE 结合使用 constexpr 值。在这种情况下,我们需要检测 constexpr 值。

但是,没有is_constexpr或类似的东西来检测编译时已知的值。另一方面,函数is_const没有用,因为constexpr不是类型的一部分。所以,你不能这样做(或者至少我不知道一个直接的解决方案)。

但是如果您知道有许多编译器在编译时计算已知值的函数的最终值,那么您会很高兴。例如,在GCC中,有&#34; SCEV最终值替换&#34;

因此,当参数未知时,您应该只使用该动态函数,编译器将根据您的意愿进行操作(如果可能)。

答案 1 :(得分:0)

GCC,Clang和英特尔编译器都支持__builtin_constant_p来检查该值是否为编译时常量,并在这种情况下提供优化表达式。

对于所有其他编译器,您可以使用动态计算作为后备。 (我不知道Visual Studio有一个等价物。)