C++ 如何处理模板化代码中的数学常数
我有一个代码(性能至关重要),可以以单精度和双精度编译。我们在整个代码中使用了大量的物理常量,这些常量来自C++ 如何处理模板化代码中的数学常数,c++,templates,C++,Templates,我有一个代码(性能至关重要),可以以单精度和双精度编译。我们在整个代码中使用了大量的物理常量,这些常量来自名称空间常量。当我无法模板化名称空间时,以首选精度提供常量的最优雅方式是什么 namespace Constants { const double meaning_of_life = 42.; } template<typename TF> TF multiply_number(const TF a) { return Constants::meaning_of
名称空间常量
。当我无法模板化名称空间时,以首选精度提供常量的最优雅方式是什么
namespace Constants
{
const double meaning_of_life = 42.;
}
template<typename TF>
TF multiply_number(const TF a)
{
return Constants::meaning_of_life*a;
}
int main()
{
double a = multiply_number<double>(5.);
// With the call below, a cast is done in multiply_number.
float b = multiply_number<float>(6.);
return 0;
}
名称空间常量
{
生命的双重意义=42。;
}
模板
TF乘_数(常数TF a)
{
返回常量::表示生命的意义*a;
}
int main()
{
双a=乘U数(5);
//在下面的调用中,将以乘法_数进行转换。
浮点数b=乘u数(6);
返回0;
}
您可以使用:
namespace Constants
{
template <typename TF> struct meaning_of_life
{
static constexpr TF value = 42.;
};
}
template<typename TF>
TF multiply_number(const TF a)
{
return Constants::meaning_of_life<TF>::value*a;
}
名称空间常量
{
模板结构表示生命的意义
{
静态constexpr TF值=42。;
};
}
模板
TF乘_数(常数TF a)
{
返回常量::生命的意义::值*a;
}
如果常量需要不同,可以专门化类模板。可以将名称空间设置为类,并将所有常量设置为类的静态成员。这将适用于任何版本的C++。 如果您可以只使用某个版本或更新的版本,那么您可以使用C++14。这将允许您将变量声明为模板,然后使用函数中的模板类型进行类似的键入
namespace Constants
{
template <typename T>
const T meaning_of_life = T(42);
}
template<typename TF>
TF multiply_number(const TF a)
{
return Constants::meaning_of_life<TF>*a;
}
名称空间常量
{
模板
const T表示生命的意义=T(42);
}
模板
TF乘_数(常数TF a)
{
返回常量::表示生命的意义*a;
}
只需将名称空间转换为存储类型T
上的模板类,并将所有常量设为static constexpr T
。因为C++14也可以用于此。而T(42)
只不过是一个静态强制转换?@Chiel Yeah。这是为了在值将被截断时使警告静音。如果你想让这些警告浮出水面,你不必拥有它。