gpt4 book ai didi

c++ - 模板代码中的 float 或 double

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:43 25 4
gpt4 key购买 nike

下面的例子可能看起来很荒谬,但它是一个更大的高性能代码的一部分,在这个代码中所介绍的技术是有意义的。我提到这一点是为了防止有人怀疑 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 常量而不为每个值创建结构的问题,是否有更好的解决方案?

(我对实际使用 double/float 的解决方案感兴趣,而不是使用两个 int 来创建有理数或定点想法(例如 y = 0.01 * M * x)的 hack。)

最佳答案

在C++11中,根本没有必要使用模板。只需以与您不同的方式使用 constexpr(通用常量表达式)即可。

 #include <iostream>

constexpr double mul(double x, double y)
{
return x*y;
}

int main()
{
std::cout << mul(2.3, 3.4) << '\n';
double x;
std::cin >> x; // to demonstrate constexpr works with variables
std::cout << mul(2.3, x) << '\n';
}

虽然我说模板不是必需的(在给定的示例中没有),但如果需要,可以将它们模板化

 template <class T> constexpr T mul(T x, T y) {return x*y;}

或者(如果你想将函数用于通过 const 引用更好地传递的类型)

 template <class T> constexpr T mul(const T &x, const T &y) {return x*y;}

关于c++ - 模板代码中的 float 或 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com