-2

C# では、次のように定義できます。

public interface BaseObject
{
    int GetValue();
}

public class Test<T> where T : BaseClass
{
    T BaseObject;
}

つまり、いつでも BaseObject.GetValue() / BaseObject->GetValue(); を呼び出すことができることがわかっています。baseobject にこのメソッドがあることを知っているからです。

C ++でこれを行う同様の方法はありますか? 複数のクラスが継承できるインターフェイスと、これを利用できるクラスを定義できるようにします。

4

2 に答える 2

0

C# ジェネリックよりもさらに強力なテンプレート (必ずしも優れているとは言えませんが、単に異なるだけです)。

template<class T>
class foo
{
public:
    int whatever() 
    { 
        return obj.GetValue();
    }
private:
    T obj;
};

使用するテンプレート引数ごとに個別のクラスが作成されます。エラーになるテンプレート型を指定すると、コンパイル時にわかります。

于 2013-02-27T21:48:15.953 に答える
0

テンプレート パラメーターの要件を指定する方法であるC++ の概念について質問しています。これらは C++11 の作業中に提案されましたが、複雑すぎて間に合わなかったことが判明しました。しかし、それらは遅れただけで、忘れられたわけではありません。

それまでの間、ダック タイピングは引き続き非常に強力であり、必要なインターフェイスを持たないテンプレート パラメーターを渡すとキャッチされます。問題がきちんと報告されないだけです。

回避策として、示した制約を確認する簡単な方法は、アップキャスト時にのみポインター変換が暗黙的であるという事実を利用します。

public class Test<T> where T : BaseClass
{
    static T* enforcement_helper = 0;
    static BaseClass* enforce_inheritance_constraint = enforcement_helper;

};

コンパイラの新しさによっては、これらの行を特別なメンバー関数内に配置する必要がある場合があります (デストラクタは、ほとんど常に処理されるため、適切です)。

ただし、エラー メッセージを改善するためにのみ制約を確認する必要があります (コードの明確にコメントされたセクションでエラーを引き起こすことにより)。C++ テンプレートはダック タイプであり、必要な操作を提供する任意のテンプレート パラメーターで動作します。正式な「インターフェース」は必要ありません。

于 2013-02-28T00:13:54.793 に答える