C++ 如何根据模板类型定义浮点常量?
在我的代码中,我有很多模板算法,其中模板类型必须是浮点(C++ 如何根据模板类型定义浮点常量?,c++,templates,constants,c++03,C++,Templates,Constants,C++03,在我的代码中,我有很多模板算法,其中模板类型必须是浮点(float,double,或long double)。其中一些算法需要默认的epsilon值。例如: template <typename FloatType> bool approx(FloatType x1, FloatType x2) { const FloatType epsilon; // How can I set it ? return abs(x2 - x1) < epsilon; } 模板 布尔
float
,double
,或long double
)。其中一些算法需要默认的epsilon值。例如:
template <typename FloatType>
bool approx(FloatType x1, FloatType x2)
{
const FloatType epsilon; // How can I set it ?
return abs(x2 - x1) < epsilon;
}
模板
布尔近似值(浮动类型x1、浮动类型x2)
{
const FloatType epsilon;//如何设置它?
返回abs(x2-x1)
我如何定义它?我尝试了以下方法,它被gcc接受,但它不是标准的(在C++11中无效)。我知道这在C++11中是可能的,但我必须与C++03兼容
template <typename FloatType>
struct default_epsilon
{};
template <>
struct default_epsilon<float>
{
static const float value = 1.0e-05f;
};
template <>
struct default_epsilon<double>
{
static const double value = 1.0e-10;
};
template <>
struct default_epsilon<long double>
{
static const long double value = 1.0e-12l;
};
// Then, I use it like that :
template <typename FloatType>
bool approx(FloatType x1, FloatType x2)
{
return abs(x2 - x1) < default_epsilon<FloatType>::value;
}
// or that
bool approx(FloatType x1, FloatType x2, FloatType epsilon = default_epsilon<FloatType>::value)
{
return abs(x2 - x1) < epsilon;
}
模板
结构默认值ε
{};
模板
结构默认值ε
{
静态常数浮点值=1.0e-05f;
};
模板
结构默认值ε
{
静态常数双值=1.0e-10;
};
模板
结构默认值ε
{
静态常数长双值=1.0e-12l;
};
//然后,我这样使用它:
模板
布尔近似值(浮动类型x1、浮动类型x2)
{
返回abs(x2-x1)
如果您不想使用std::numeric\u limits::epsilon()
,我认为您可以按照注释中的建议:在类定义之外初始化静态
成员
你可以写:
#include <cmath>
template <typename FloatType>
struct default_epsilon
{};
template <>
struct default_epsilon<float>
{
static const float value;
};
template <>
struct default_epsilon<double>
{
static const double value;
};
template <>
struct default_epsilon<long double>
{
static const long double value;
};
template <typename FloatType>
bool approx(FloatType x1, FloatType x2)
{
return std::abs(x2 - x1) < default_epsilon<FloatType>::value;
}
#包括
模板
结构默认值ε
{};
模板
结构默认值ε
{
静态常量浮点值;
};
模板
结构默认值ε
{
静态常数双值;
};
模板
结构默认值ε
{
静态常数长双值;
};
模板
布尔近似值(浮动类型x1、浮动类型x2)
{
返回std::abs(x2-x1)
在.cpp文件中的某个地方:
const float default\u epsilon::value=1.0e-05f;
常量双默认值ε::值=1.0e-10;
常量长双默认值ε::值=1.0e-12l;
<> P>使用传统C++编译器运算符超载
class MyEpsilon
{
public:
operator float() {return 1.0e-05f;};
operator double() { return 1.0e-10; };
operator long double() { return 1.0e-12l; };
};
template<class T>
class MyTest {
public:
T DoSome() {
MyEpsilon e;
return T(e);
}
};
MyEpsilon类
{
公众:
运算符float(){return 1.0e-05f;};
运算符double(){return 1.0e-10;};
运算符long double(){return 1.0e-12l;};
};
模板
类MyTest{
公众:
T DoSome(){
髓鞘蛋白e;
返回T(e);
}
};
如果您喜欢数字限制,请使用(内联)函数。但它不是标准的。为什么?我必须与c++03兼容。模板专业化不是C++的,因为C++ 11,它也在C++ 03中。@程序员,这不是我的首选解决方案,因为在函数声明中,我不能将它用作默认的参数值。@ Caduchon初始化类定义之外的静态常数。@ Caduchon为什么您认为不能使用函数调用作为默认参数?哎呀,这从来都不是真的。
class MyEpsilon
{
public:
operator float() {return 1.0e-05f;};
operator double() { return 1.0e-10; };
operator long double() { return 1.0e-12l; };
};
template<class T>
class MyTest {
public:
T DoSome() {
MyEpsilon e;
return T(e);
}
};