我有一个代码(性能至关重要),我可以用单精度和双精度编译。我们在namespace Constants
的代码中使用了很多物理常量。以优选精度提供常量的最优雅方式是什么,因为我无法模板化命名空间?
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;
}
答案 0 :(得分:1)
您可以使用:
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;
}
如果常量需要不同,您可以专门化类模板。
答案 1 :(得分:1)
您可以将命名空间设为类,并使所有常量成为类的静态成员。这适用于任何版本的C ++。
如果您只使用某个版本或更新版本,那么您可以使用C ++ 14中的variable templates。这将允许您将变量声明为模板,然后使用函数中的模板类型来键入它,如
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;
}