如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?

Posted

技术标签:

【中文标题】如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?【英文标题】:How do I make a class whose interface matches double, but upon which templates can be specialized? 【发布时间】:2010-06-17 02:40:51 【问题描述】:

如何创建一个接口匹配双精度,但其模板类型不动态转换为双精度的类?

原因是我有一个运行时类型系统,我希望能够有一个像 double 一样工作的类型:

template<int min_value, int max_value>
class BoundedDouble: public double ;

然后使用模板特化来获取关于该类型的运行时信息:

template<typename T>
class Type  etc. 

template<int min_value, int max_value>
class Type<BoundedDouble<min_value, max_value>>  int min() const  return min_value;  etc. 

但是,你不能从 double 继承...

【问题讨论】:

不要尝试——你只会让其他维护者的眼睛流血。如果您需要这样的东西,请使用组合而不是继承,并使用显式转换函数..即 ToDouble。 【参考方案1】:

您不能从本机类型派生。改用合成:

#include <cstdlib>
#include <string>
#include <stdexcept>
#include <iostream>
using namespace std;

template<typename Type = double, const Type& Min = -10.0, const Type& Max = 10.0> class Bounded

public:
    Bounded() ;
    Bounded(const Type& rhs) : val_(rhs) 
     
        if(rhs > Max || rhs < Min) 
            throw logic_error("Out Of Bounds"); 
    

    operator Type () const 
     
        return val_; 
    

    Type val_;
;


int main()

    typedef Bounded<double, -10.0, 10.0> double_10;
    double_10 d(-4.2);
    cout << "d = " << d << "\n";
    double d_prime = d;
    cout << "d_prime = " << d_prime << "\n";
    double_10 d2(-42.0);
    cout << "d2 = " << d << "\n";


    return 0;

输出是:

d = -4.2
d_prime = -4.2

【讨论】:

以上是关于如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何舍入双精度值但保持尾随零

哪些列通常可以制作好的索引?

与 zip aws S3 对象相关的类和接口都有哪些?

在 C++ 中创建具有 2 个双精度值的类

是否可以专门针对触摸输入设备?

postgres查询不匹配负双精度值