5

以下は、私が静的ポリモーフィズムとして理解している非常に単純な例です。PROCESSOR動的ポリモーフィズムを使用しない理由は、 inの関数のインライン展開を妨げたくないからですop

template <class PROCESSOR>
void op(PROCESSOR* proc){
    proc->doSomething(5);
    proc->doSomethingElse();
}

int main() {
    ProcessorY py;
    op<ProcessorY>(&py);
    return 0;
}

この例の問題点は次のとおりです。どの関数を定義する必要があるかについての明示的な定義が存在しませんPROCESSOR。どちらかが欠けていると、コンパイル エラーが発生します。これはスタイルが悪いと思います。

また、これには非常に実用的な欠点もあります。もちろん、IDE のオンライン アシスタンスでは、そのオブジェクトで使用できる機能を表示することはできません。

のパブリックインターフェースを定義するための良い/公式の方法は何PROCESSORですか?

4

2 に答える 2

3

PROCESSOR が定義しなければならないメソッドの明示的な定義はありません。どちらかが欠けていると、コンパイル エラーが発生します。これはスタイルが悪いと思います。

です。そうではない。そうかも知れない。場合によります。

はい、このように動作を定義したい場合は、テンプレート パラメーターが持つべきコンテンツも制限したい場合があります。残念ながら、現時点ではこれを「明示的に」行うことはできません。

必要なのは、C++ 11 の一部として表示されるはずだった制約と概念の機能ですが、遅れており、C++ 14 の時点ではまだ利用できません。

ただし、多くの場合、コンパイル時エラーを取得することが、テンプレート パラメーターを制限する最良の方法です。例として、stdライブラリを使用できます。

1) イテレータ。

C++ ライブラリでは、いくつかのタイプの反復子が定義forward_iteratorされています: 、random_access_iteratorおよびその他。タイプごとに、使用できることが保証されている一連のプロパティと有効な式が定義されています。random_access_iteratorin containerと完全に互換性がないイテレータを使用するrandom_access_iteratorと、ある時点でコンパイラ エラーが発生します (おそらく、このイテレータ クラスで必要な逆参照演算子 ([]) を使用する場合)。

2) アロケーター。

ライブラリ内のすべてのコンテナーは、stdアロケーターを使用してメモリの割り当て/解放とオブジェクトの構築を実行します。デフォルトでは、std::allocatorが使用されます。自分のものと交換したい場合は、std::allocator保証されているすべてのものを持っていることを確認する必要があります。そうしないと、コンパイル時エラーが発生します。

したがって、概念を理解するまでは、これが最善かつ最も広く使用されているソリューションです。

于 2015-04-26T12:03:05.563 に答える
1

まず、静的ポリモーフィズムの例に問題はないと思います。静的であるため、つまりコンパイル時に解決されるため、定義上、インターフェイス定義に関する要求はそれほど厳密ではありません。

また、間違ったコードがコンパイル/リンクされないことは絶対に正当ですが、コンパイラからのより明確なエラーメッセージはより良いでしょう.

ただし、インターフェイスの定義に固執する場合は、例を次のように書き直すことができます。

template <class Type>
class Processor
{
public:
    void doSomething(int);
    void doSomethingElse();
};

template <class Type>
void op(Processor<Type>* proc){
    proc->doSomething(5);
    proc->doSomethingElse();
}

// specialization
template <>
class Processor<Type_Y>
{
    // implement the specialized methods
};

typedef Processor<Type_Y> ProcessorY;

int main() {
    ProcessorY py;
    op(&py);
    return 0;
}
于 2015-04-26T11:46:17.910 に答える