我开始熟悉C ++中的特征。 我有这些课程:
class Basic_traits {
public:
...
static const int prec = 0;
};
template<typename T>
class Traits : public Basic_traits {
public:
...
};
class Temperature {
double t;
public:
Temperature(double temp = 50) : t(temp) {};
double operator()() { return t; };
Temperature& operator=(double temp) { t = temp; return *this; };
};
template<>
class Traits<Temperature> : public Basic_traits{
public:
...
static const int prec = 2;
friend ostream& operator<<(ostream& os, const Temperature&) {
os.precision(prec);
}
};
我想在这里做的是重载&lt;&lt;类Temperature的运算符,它将以预先特征给出的精度来输出t变量。 这甚至可能吗?如果是这样,那我该怎么办?运算符是否应该在模板中?我把它放在那里因为这是prec的位置,类Temperature本身与包含变量prec的Basic_traits没有任何关系。
/////////////////////////////////////////////// /////////////////////////////////
我的操作员现在看起来像这样:
friend ostream& operator<<(ostream& os, const Temperature&) {
os.precision(Traits<Temperature>::prec);
return os << (Temperature);
}
答案 0 :(得分:1)
以下示例使用定义Measurement
运算符的基类模板ostream
,并使用Traits<T>
设置输出值的精度。
template<typename T>
struct Measurement
{
double val;
friend std::ostream& operator<<(std::ostream& os, const Measurement<T>& measurement)
{
return os << std::setprecision(Traits<T>::prec) << measurement.val;
}
};
然后我们可以进行不同类型的测量,例如Temperature
:
struct Temperature : Measurement<Temperature>
{
Temperature(double v)
{
val = v;
}
};
我们可以为Traits
Temperature
template<>
struct Traits<Temperature>
{
static const int prec = 2;
};
现在,当您输出Measurement
的任何内容时,它将使用派生类的特定特征。
以下是一个完整的示例:
#include <iostream>
#include <iomanip>
template<typename T>
struct Traits
{
static const int prec = 0;
};
// our base class "Measurement"
template<typename T>
struct Measurement
{
double val;
friend std::ostream& operator<<(std::ostream& os, const Measurement<T>& measurement)
{
return os << std::setprecision(Traits<T>::prec) << measurement.val;
}
};
// a specific measurement type, Temperature
struct Temperature : Measurement<Temperature>
{
Temperature(double v)
{
val = v;
}
};
// specialise Traits for Temperature
template<>
struct Traits<Temperature>
{
static const int prec = 2;
};
// a specific measurement type, Distance
struct Distance : Measurement<Distance>
{
Distance(double v)
{
val = v;
}
};
// specialise Traits for Distance
template<>
struct Traits<Distance>
{
static const int prec = 4;
};
int main()
{
Temperature temp { 5.2134 };
Distance dist { 5.2134 };
std::cout << temp << '\n';
std::cout << dist << '\n';
return 0;
}