【问题标题】:c++ templates and overloading operatorsc++ 模板和重载运算符
【发布时间】:2012-11-08 00:17:59
【问题描述】:

我正在尝试了解该程序的工作原理。我是 C++ 模板的新手。 有人能解释一下为什么我们需要以下函数吗?

friend std::ostream &operator <<(std::ostream &os, const Temp &temp)

它似乎只适用于字符串模板。

另外,operator T() {return val;} 函数有什么作用?

#include <iostream>
#include<string>

template <typename T>
class Temp {        
    friend std::ostream &operator <<(std::ostream &os, const Temp &temp) {
    os << temp.val;
    return os;
    }

public:
    Temp(T val) : val(val) {}
    operator T() {return val;}
public:
    T val;
};

用法示例:

#include <iostream>
#include<string>

#include "temp2.h"

using namespace std;

int main() {
    temp<int> si = 10;
    cout << "si: " << si << endl;
    si = si + 2;
    cout << "After si = si + 2: " << si << endl;

    Temp<double> si2 = 15.5;
    cout << "si: " << si2 << endl;
    si2 = si2 + 2.3;
    cout << "After si = si + 2: " << si2 << endl;

    Temp<string> ss = string("Hello");
    cout << "ss: " << ss << endl;
    ss = string(ss).substr(1);
    cout << "After ss = si.substr(1): " << ss << endl;

    return 0;
}

【问题讨论】:

  • 确切的错误是什么?
  • 只是试图理解程序没有错误
  • 当字符串不是模板参数时它说什么,“似乎只适用于字符串模板”
  • @KarishKarish:你从哪里得到这个源代码?
  • 我对@9​​87654325@ 比较冷淡,尤其是如果 T 曾经是 CV。相反,我会使用operator const T&amp;() const,但每个人都有自己的。

标签: c++ templates operators


【解决方案1】:

并不是真的需要运算符&lt;&lt;,而是在使用输出流的时候有它很方便。此外,操作员需要访问 Temp 类的内部值,因此需要使用 friend 限定符。没有它,该类将不得不以某种方式将内部值 val 暴露给外部世界(通常的方法是创建一个公共只读方法),这会产生维护问题,因为该类的未来演变将不得不继续支持该方法,即使类内部发生变化。

换句话说,将&lt;&lt; 运算符声明为类的友元可以防止实现细节泄露给世界其他地方。

也就是说,T() 运算符几乎提供了我上面描述的假设只读方法的服务,但通过复制val 字段来替换只读部分。基本上,它是一个转换运算符,允许将 Temp 值隐式转换为 T 值。 &lt;&lt; 运算符可以使用该转换运算符实现,因此不需要朋友限定符。然而,当然出于效率考虑,朋友限定符被保留以避免复制val 的开销。

关于&lt;&lt; 运算符的实现,我们可以看到它依赖于为 T 类型名定义的相同运算符。定义了此运算符的任何类型都应该可以在此模板中正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多