Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何根据模板类型定义浮点常量?_C++_Templates_Constants_C++03 - Fatal编程技术网

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);
    }
};