2016-09-18 151 views
0

如何方便地將很多模板函數聲明爲模板類的朋友函數?聲明許多功能作爲一個類的朋友

例子:

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得到重複每個許多功能....

是否有可能將所有這些功能到的東西,然後聲明一切那些東西是模板類的朋友?

+3

爲什麼會有這麼多的朋友的功能呢?也許你應該重新考慮你的設計。 –

+0

我正在寫一個n維數組之間的數學小庫。 myclass是一個n維數組對象。這些函數是在ndarrays上運行的許多數學運算。可能是我可以把所有的功能變成ndarray對象的方法。哼。但後來我得到了像A.sin()而不是罪(ndarray A)的東西。那感覺有點奇怪。 – rxu

+1

也許你應該用'iterator'或'operator []'暴露數組的元素。簡單地將功能稱作「朋友」並不是一個好主意。否則,每次添加新函數時,都必須修改「MyClass」。 –

回答

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

是的!你可以讓他們static成員函數的一個class,並使該class a friend

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