gpt4 book ai didi

c++ - 模板中的 float 转换

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:54 25 4
gpt4 key购买 nike

采用这个函数模板:

template <typename T>
T divby2(T a)
{
return .5 * a;
}

是否存在一种方法来指定 (.5),double 常量,以便它不会在运行时转换为 TT != double(比如,当Tfloat)时?

关于 .5 常量的替代规范的一些想法:

template <typename T>
T divby2(T a)
{
return T(.5) * a;
}

template <typename T>
T divby2(T a)
{
return (T(1) / T(2)) * a;
}

最佳答案

在运行时没有关于转换的决定。是否将值转换为另一种类型的决定是在编译时做出的。

  • .5 将是 double ,无论如何。
  • a 将是您拥有的任何模板特化,即 T
  • 类型
  • 乘法的结果类型(我们称它为 X)将是 operator*(double, T) 给出的任何类型。所有内置数字的 double ,除了 long double,它给出一个 long double
  • 由于您返回的是 T,因此乘法返回的 X 将转换为 T
  • T(0.5) 永远是 T。

如果这些转换中的任何一个或 operator* 未定义,则会出现编译时错误。类型与运行时无关(除非你有虚函数之类的)。

对于您的评论:T(.5) 是类型 T 的表达式。 的转换将概念上发生在运行。但是,允许编译器对其进行优化,例如如果 T 是 int,编译器将用 int(.5) 实例化 T(.5) 并立即将其优化为 0

根据您的问题,我假设您可能不了解模板的性质。与某些其他语言中的通用函数不同,模板在编译时 进行评估和实例化。模板实例化意味着,编译器为您使用模板的每种类型生成独立的函数。所以例如如果您在不同的地方使用 T=doubleT=intT=long double 函数,就好像您已经编写了三个功能:

double divby2(double a)
{
return .5 * a;
}

int divby2(int a)
{
return .5 * a;
}

long double divby2(long double a)
{
return .5 * a;
}

在第一个函数中,根本不会发生任何转换,因为一切都是 double 的。在第二个函数中,编译器知道 double 乘以 int 得到 double,但是 double 被转换回 int。您可能会收到有关此的警告。在第三个函数中,double 和 long double 相乘得到 long double。由于返回类型也是 long double,所以一切正常,您不会收到警告。

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

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