这是为浮点/双精度泛化函数的正确方法吗?

Zeb*_*ish 2 c++ generics templates

在我的功能:

template <typename T>
T lerpMidway(const T& a, const T& b)
{
    T result;
    result = (b - a) * 0.5 + a;
    return result;
}

int main()
{
    lerpMidway(4.f, 6.f);
}
Run Code Online (Sandbox Code Playgroud)

如果我将浮点值传递给此函数,我认为0.5会将所有其他浮点数提升为双精度数,然后在返回时将其转换回浮点数.

我试过这条线:

result = (b - a) * decltype(a)(0.5) + a;
Run Code Online (Sandbox Code Playgroud)

它摆脱了编译器消息说双重浮动可能丢失的数据,但是如果"a"是浮点数,并且我用双精度初始化它,那么没有转换发生?我也可以用0.5f初始化它并没有什么区别?

n. *_* m. 7

在C++中,0.5有类型double,并且0.5f有类型float.无法指定作为模板参数的类型的文字.在这种情况下,演员是可以接受的.

我建议static_cast而不是功能样式.decltype是不必要的,有问题的类型已经有了名字,T.

因此,static_cast<T>(0.5)完全可以.

从纯粹抽象的角度来看,有一种转换doublefloat(或任何类型T表示).实际上,这种转换是无操作的.从编译器的角度来看,这是一个简单的常量折叠情况.