C ++具有特征的类的重载运算符

时间:2017-11-21 18:54:34

标签: c++ templates operator-overloading traits

我开始熟悉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);
}

1 个答案:

答案 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;
}