如果我有一个功能
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);
}
答案 0 :(得分:1)
你不能这样做,但它将由智能编译器完成。
也许首先想到的解决方案是将 SFINAE 结合使用 constexpr 值。在这种情况下,我们需要检测 constexpr 值。
但是,没有is_constexpr
或类似的东西来检测编译时已知的值。另一方面,函数is_const
没有用,因为constexpr
不是类型的一部分。所以,你不能这样做(或者至少我不知道一个直接的解决方案)。
但是如果您知道有许多编译器在编译时计算已知值的函数的最终值,那么您会很高兴。例如,在GCC中,有&#34; SCEV最终值替换&#34; 。
因此,当参数未知时,您应该只使用该动态函数,编译器将根据您的意愿进行操作(如果可能)。
答案 1 :(得分:0)
GCC,Clang和英特尔编译器都支持__builtin_constant_p来检查该值是否为编译时常量,并在这种情况下提供优化表达式。
对于所有其他编译器,您可以使用动态计算作为后备。 (我不知道Visual Studio有一个等价物。)