2016-09-18 5 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次元の配列オブジェクトです。この関数は、ndarrayで動作する数学演算です。私はすべての関数をndarrayオブジェクトのメソッドにすることができます。うーん。しかし、私はsin(ndarray A)の代わりにA.sin()のようなものを得ます。それはちょっと奇妙だと感じます。 – rxu

+1

配列の要素を 'iterator'または' operator [] 'で公開する必要があるかもしれません。単に関数を 'friend'にするのは良い考えではありません。それ以外の場合は、新しい関数を追加するたびに、 'MyClass'を変更する必要があります。 –

答えて

2

どのように友人のクラスについて、すべての機能は、1人のフレンドクラスに行くことができます:

#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

はい!あなたはclassのメンバー機能をstaticにして、classfriendとすることができます。

template <typename T> 
class MyClass{ 
    protected: 
    T a; 
    friend class MyFunctions; 
} 
関連する問題