1

重複の可能性:
コンパイル時に動的に構造を生成する

Base1現在、派生クラスを条件のいずれかから、またはBase2条件に応じて(C ++ 03で)継承したいという状況に直面しています。つまり、次のようなものを実装したいと思います。

// pseudo-C++ code
class Derived : public
    if(condition) Base1    // inherit from Base1, if condition is true
    else Base2             // else inherit from Base2
{ /* */ };

これは良いデザインではないかもしれませんが、現実の世界は完璧ではありません。

ここで答えを検索しましたが、プリプロセッサディレクティブを使用したくありません。C++でのifdefベースの継承に関する問題

他にどのようにこれを達成できますか?

4

1 に答える 1

4

テンプレートと部分特殊化を使用して解決策を見つけました。以下のコードはトリックを行います:

// provide both the required types as template parameters
template<bool condition, typename FirstType, typename SecondType>
class License {};

// then do a partial specialization to choose either of two types 
template<typename FirstType, typename SecondType>
class License<true, FirstType, SecondType> {
public:    typedef FirstType TYPE;     // chosen when condition is true
};

template<typename FirstType, typename SecondType>
class License<false, FirstType, SecondType> {
public:    typedef SecondType TYPE;    // chosen when condition is false
};

class Standard {
public:    string getLicense() { return "Standard"; }
};

class Premium {
public:    string getLicense() { return "Premium"; }
};

const bool standard = true;
const bool premium = false;

// now choose the required base type in the first template parameter
class User1 : public License<standard, Standard, Premium>::TYPE {};
class User2 : public License<premium, Standard, Premium>::TYPE {};

int main() {
    User1 u1;
    cout << u1.getLicense() << endl;   // calls Standard::getLicense();
    User2 u2;
    cout << u2.getLicense() << endl;   // calls Premium::getLicense();
}

構文はきれいに見えませんが、結果はプリプロセッサディレクティブを使用するよりもきれいです。

于 2012-12-08T17:27:35.990 に答える