以下示例可能看起来毫无意义,但它是一个更大的高性能代码的一部分,所以所呈现的技术是有意义的。我提到这一点只是为了防止有人怀疑这是一个 XY 问题 - 这很可能不是。
我有一个带有模板/编译时操作数的函数:
我有一个带有模板/编译时操作数的函数:
template <int M>
int mul(int x){
return M * x;
}
现在我想对double
做同样的操作,但这是不被允许的:
template <double M> // you can't do that!
int mul(double x){
return M * x;
}
因此,为了在编译时仍然加入double
,我只能看到以下解决方案:
// create my constants
struct SevenPointFive{
static constexpr double VAL = 7.5;
}
struct ThreePointOne{
static constexpr double VAL = 3.1;
}
// modified function
template <class M>
int mul(double x){
return M::VAL * x;
}
// call it
double a = mul<SevenPointFive>(3.2);
double b = mul<ThreePointOne>(a);
有没有更好的解决方案来在模板参数中传递双精度常量,而不是为每个值创建一个结构体?
(我感兴趣的是实际使用double/float的解决方案,而不是使用两个int创建有理数或固定点思想的hack,例如y = 0.01 * M * x。)
<size_t nom, size_t denom>
进行模板化。 - Ami Tavory