gpt4 book ai didi

c++ - 使用 friend 来减少冗长

转载 作者:太空狗 更新时间:2023-10-29 20:55:28 25 4
gpt4 key购买 nike

使用 friend 在类定义中定义全局函数是否被认为是一种好的做法,即使不需要访问私有(private)成员。例如

template<typename T>
class A {
public:
A(T v);
T value() const;

friend A operator+(T n, const A& a) {
return A(a.value() + n);
}
};

代替

template<typename T>
class A {
public:
A(T v);
T value() const;
};

template<typename T>
A<T> operator+(T n, const A<T>& a) {
return A<T>(a.value() + n);
}

尽管 operator+ 仅使用公开的 value()。这是否很常见,我们不推荐这样做吗?

最佳答案

friend 有一个主要优势这里。当我们定义:

friend A operator+(T, const A&);

不是函数模板。这只是一个函数——一个只有 ADL 才能找到的特殊函数。但由于它不是函数模板,转换仍然可以发生。另一方面:

template <class T>
A<T> operator+(T, const A<T>&)

是一个普通的旧函数模板,具有关于模板类型推导的所有普通规则。

为什么这很重要?考虑:

A<double> a(4.2);
5 + a;

在第一种情况下,这完全没问题。我们找到operator+(double, const A<double>&) , 5转换为 5.0 ,这是允许的转换,我们返回 A<double>(9.2) .

在第二种情况下,模板推导失败,因为 T推导出两个参数的不同类型。因此,代码格式错误。

关于c++ - 使用 friend 来减少冗长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35661133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com