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

标签 c++ templates operator-overloading traits

我开始了解 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/

相关文章:

c++ - 使用类的 vector

eclipse - Eclipse 中的通用代码片段或模板

c++ - 重载复合赋值运算符

c++编译器如何知道参数是STL容器?

c++ - 合并相同的模板,并使用不同的功能代替

c# - 永远不会调用覆盖相等运算符

原始类型的 C# 重载运算符

c++ - 传递条件作为参数

c++ - dllexported 附加字符串已损坏

c++ - 在 C++ lldb 中使用重载运算符评估表达式