将多个函数声明为类的友元

Declare many functions as friends of a class

本文关键字:友元 声明 函数      更新时间:2023-10-16

如何方便地将多个模板函数声明为模板类的友元函数?

的例子:

template <typename T>
void funct1(MyClass<T> & A); //1.forward declaration.
template <typename T>
class MyClass{
    protected:
    T a;
    friend funct1(MyClass<T> & A); //2.declare friend
}
template <typename T>
void funct1(MyClass<T> & A){ //3.actual implementation
    ++A.a;
}

步骤1、2、3对每个函数都重复....

是否有可能将所有这些函数组合成某个东西,然后声明其中的所有东西都是模板类的朋友?

那么一个friend类呢,所有的函数都可以放到一个friend类中:

#include <iostream>
using namespace std;
template <typename T>
class MyFriend;
template <typename T>
class MyClass{
    protected:
      T a;
    public:
      MyClass(T _a):a(_a) {}
    friend MyFriend<T>;
};
template <typename T>
class MyFriend {
  public:
  void funct1(MyClass<T> &A) {
    ++A.a;
    cout << "A.a: " << A.a << endl;
  }
  void funct2(MyClass<T> &B) {
    B.a +=  2;
    cout << "A.a: " << B.a << endl;
  }
};
int main() {
  MyClass<int> myclass(0);
  MyFriend<int> myfriend;
  myfriend.funct1(myclass);
  myfriend.funct2(myclass);
  return 0;
}

是的!你可以把它们变成staticclass的成员函数,把class变成friend

template <typename T>
class MyClass{
    protected:
    T a;
    friend class MyFunctions;
}