2016-06-12 16 views
-4

私は関数f = sigma(phi(x))を持っています。関数sigmaとphiに対して異なる形式を割り当てたいとします.2つのシグマ関数と2つのphi関数を持っているとしましょう。 4 = 2 * 2の組み合わせを有する。どうすればこれを達成できますか?C++の多重継承ロジック

f = sigma(x)の場合のみ、私はfに仮想関数としてsigmaを書き、sigmaの特定の形式をサブクラスとして定義します。

class sigma1: public class f{sigma=sigma1} 

class sigma2: public class f{sigma=sigma2} 

しかし、phiが関与すると、私は本当に混乱します。私は再びphiを仮想関数として定義する必要があると思います。しかし、特定のphiについては、それはする必要があります

class phi1 : public sigma1, public sigma 2 

class phi2 : public sigma1, public sigma 2 

私はオブジェクトsigma1 + phi1を作成したいと思います。どうすればこのことができますか?

phi1 object1 

この場合、明らかにsigma1またはsigma2の使用を知ることはできません。仮想継承も機能していないようです。私は

class phi1 : public sigma1 {phi=phi1} 

class phi2 : public sigma2 {phi=phi1} 

class phi3 : public sigma1 {phi=phi2} 

class phi4 : public sigma2 {phi=phi2} 

のように4クラスを作成することができることを知っている。しかし、これはスマートではないようです....

+4

のため申し訳ありませんが、あなたは、理想的には、[MCVE]してください、私たちの実際のコードサンプルを与えることができます。 –

答えて

0

は、あなたのクラスを使用するつもりですか、私には、明確ではない(または関数、または何が欲しいか)を示していますが、私はあなたのphi()関数とsigma()関数がタイプTの変数を受け取り、同じ型の値を返すという仮説に基づいて、次の単純な解を提案します。T

は、だから私はタイプ Tintを受け、完全なシグマとの例()とphi()関数であり、次の引数

template <typename T, T (*Sigma)(const T &), T (*Phi)(const T &)> 
struct f 
{ 
    T operator() (const int & x) const 
    { return Sigma(Phi(x)); } 
}; 

としての機能SigmaPhiを受け取るテンプレートファンクタを構築してきましたその他のソリューションが可能ですint

#include <iostream> 

int sigma1 (const int & x) 
{ return x+1; } 

int sigma2 (const int & x) 
{ return x-1; } 

int phi1 (const int & x) 
{ return x+10; } 

int phi2 (const int & x) 
{ return x-10; } 


template <typename T, T (*Sigma)(const T &), T (*Phi)(const T &)> 
struct f 
{ 
    T operator() (const int &x) const 
    { return Sigma(Phi(x)); } 
}; 


int main() 
{ 
    f<int, sigma1, phi1> f11; 
    f<int, sigma1, phi2> f12; 
    f<int, sigma2, phi1> f21; 
    f<int, sigma2, phi2> f22; 

    std::cout << "f11(100) = " << f11(100) << std::endl; 
    std::cout << "f12(100) = " << f12(100) << std::endl; 
    std::cout << "f21(100) = " << f21(100) << std::endl; 
    std::cout << "f22(100) = " << f22(100) << std::endl; 

    return 0; 
} 

を返します。たとえば、テンプレート化されたファンクタの代わりにテンプレート化された関数を記述することができます。

しかし、私は繰り返します:私には、あなたは何を得たいと思いますか?

p.s:私の悪い英語