5

如果我有一个功能

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);
}
4

2 回答 2

1

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

也许想到的第一个解决方案是将SFINAEconstexpr值结合使用。在这种情况下,我们需要一些东西来检测constexpr值。

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

但是,如果您知道有许多编译器可以在编译时为已知值计算函数的最终值,那么您会很高兴。例如在 GCC 中,有"SCEV final value replacement"

因此,当参数未知时,您应该只使用该动态函数,编译器会按照您的意愿执行(如果可能的话)。

于 2014-07-13T15:47:39.540 回答
0

GCC、Clang 和 Intel 编译器都支持__builtin_constant_p以检查该值是否为编译时常量并在这种情况下提供优化的表达式。

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

于 2014-07-13T16:47:59.313 回答