将许多函数声明为类的朋友

时间:2016-09-18 04:26:11

标签: c++ templates friend

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

示例:

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对许多函数中的每一个都重复....

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

2 个答案:

答案 0 :(得分:2)

是的!您可以static成为class成员函数,并将class设为friend

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

答案 1 :(得分:2)

朋友班怎么样,所有的功能都可以进入那个朋友班:

#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;
}