4

ATL/WTLコードのテンプレートの目的を理解するのに多くの問題があります。

WTLを見ると、次のようなコードが表示されます。

template <class TBase>
class CEditT : public TBase
{
    ...
};

typedef CEditT<ATL::CWindow> CEdit;

CEditTテンプレート基本クラスで定義されるのはなぜですか?

言い換えれば、どのシナリオCEditT<T>でインスタンス化されないTのですか? CWindow

4

4 に答える 4

3

ATL::CWindowこれは、ATL/WTLクラスによって呼び出されるメソッドをオーバーライドできるようにするためです。で気に入らないものがある場合は、オーバーライドされたメソッドを使用しATL::CWindowてクラスを派生させてから、新しいクラスをとして渡すことができます。ATL::CWindowTBase

たとえばATL::CWindow::CenterWindow、長い間、複数のモニターを適切に考慮しないというバグがあり、人々がこの手法を使用CenterWindowして固定実装でオーバーライドするのを見てきました。

于 2012-04-24T06:11:07.460 に答える
2

代わりに構成が使用されたとします。

template <class TBase> class CEditT {
public:
  TBase base;
  ...
};

これは、次のようなものとそれほど違いはありません。

template <class ITEM> class ListNode {
public:
   ITEM item;
   ListNode<ITEM> *next;
   // ...
};

ListNodeITEM代わりに、のようにを継承できますが、欠点は、のような基本的なタイプにCEditTできないことです。一方、aは一種のであり、便利な場合がありますさらに、の任意の部分にアクセスできます。TBaseITEMintListNodeITEMprotected:ITEM

于 2012-04-23T02:50:05.497 に答える
1

これは、不思議なことに繰り返されるテンプレートパターンを利用できるようにするためです。CEditT定義の派生クラスを作成する場合は、になりますclass CMyEdit : public CEditT<CMyEdit>thisポインタをクラスに静的にキャストCEditTすることで、vtableを使用せずにメソッドを呼び出すことができます。

于 2012-04-23T03:10:17.477 に答える
0

すべてがATL/WTLのテンプレート基本クラスを使用するのはなぜですか?

一言で言えば、デザインパターン(C ++イディオムではなく)のおかげで「コンパイル時のポリモーフィズムの奇妙な形」を実現するために、「基本クラスの基本クラスを指定する」手法として「逆さまの継承」と呼ぶことができます。 「独自のクラスをクラス階層に挿入できるようにする」ことで、「特定の派生クラスに実装をハードコーディングすることなく」、特殊な型の柔軟性を実現できます。

これはすべて、優れた記事ATLと逆さまの継承-Jim Beveridgeによって書かれ、1999年7月にVisual C ++DevelopersJournalによって公開されたATLの非定型設計アプローチを理解した後に明らかになるはずです。同じ記事の完全な非ページ化コピーへのリンクは次のとおりです。 (Wayback Machineにもあります)。

于 2019-10-02T19:20:21.970 に答える