我开始了解 C++ 中的特征。 我有这些类(class):
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);
}
};
我想在这里做的是为类 Temperature 创建一个重载的 << 运算符,它将使用 prec 特征中给定的精度计算 t 变量。 这可能吗?如果是这样,那我该怎么做?运算符应该在模板中吗?我把它放在那里是因为那是 prec 所在的位置,而类 Temperature 本身与包含变量 prec 的 Basic_traits 没有任何关系。
////////////////////////////////////////////////////////////////////////////
我的运算符(operator)现在看起来像这样:
friend ostream& operator<<(ostream& os, const Temperature&) {
os.precision(Traits<Temperature>::prec);
return os << (Temperature);
}
最佳答案
这是一个使用基类模板的示例 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;
}
关于具有特征的类的 C++ 重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420614/