c++ - 使用模板重载 << 运算符来更改输出

标签 c++ operator-overloading

我有一个名为 number 的类,我需要有关运算符重载的帮助。

template<class T>
class Number{
public:
    Number(T _numerator,T _denominator){
        numerator = _numerator;
        denominator = _denominator;
    }
    ~Number(){
        ;
    }
    T GetData(){
        return numerator/denominator;
    }
    friend std::ostream &operator<<(std::ostream &out, Number c)     //output
    {
        out << c.numerator/c.denominator;
        return out;
    }
    void SetData(T _numerator,T _denominator){
        numerator = _numerator;
        denominator = _denominator;
    }

private:
    T numerator;
    T denominator;
};

这就是我所拥有的有效方法,但我想要另一个重载的运算符,例如:

template<class X>
friend std::ostream &operator<<(std::ostream &out, Number c)     //output
{
    out << (X)c.numerator/(X)c.denominator;
    return out;
}

这样我就可以像这样调用 cout (我知道我可以将 Number 的模板更改为 double,但这不是我想要的):

Number<int> t(10,23);
std::cout << t<double> << "\n";

但是这不能编译。 那么有没有办法使用这样的模板呢?或者除了创建普通函数之外的替代解决方案?

最佳答案

我认为你想得太复杂了,你想使用它的方式是行不通的。

当您需要它是 Double 时,请将其设置为 Double,因此我在此处添加了新成员 as()

template<class T>
class Number{
public:
    Number(T _numerator,T _denominator){
        numerator = _numerator;
        denominator = _denominator;
    }
    ~Number(){
        ;
    }
    T GetData(){
        return numerator/denominator;
    }
    friend std::ostream &operator<<(std::ostream &out, Number c)     //output
    {
        out << c.numerator/c.denominator;
        return out;
    }
    void SetData(T _numerator,T _denominator){
        numerator = _numerator;
        denominator = _denominator;
    }

    template<typename U>
    Number<U> as(){
        return Number<U>(U(numerator), U(denominator));
    }

private:
    T numerator;
    T denominator;
};


Number<int> t(10,23);
std::cout << t.as<double>() << "\n";

关于c++ - 使用模板重载 << 运算符来更改输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438475/

相关文章:

c++ - 为什么函数不能阻止不同返回类型的构造?

c# - 从 C++ 调用 C#

c++ - 过载解析的问题

c++ - 避免对模板化类方法进行隐式转换

c++ - 运算符重载取模函数

c++ - 在 WSL 上编译时找不到“iostream”文件

c++ - 使用指针的嵌套结构 - 初始化和使用

c++ - 媒体基金会 : Cannot change a FPS on webcam

c++ - 如何在 C++ 中重载 opAssign 运算符 "globally"

c++ - 错误:return type specified for 'operator std::string {aka std::__cxx11::basic_string<char>}'