如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?
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
【讨论】:
以上是关于如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?的主要内容,如果未能解决你的问题,请参考以下文章