プレーンでシンプル:通常の過負荷解決よりもタグディスパッチの利点は何ですか?通常の過負荷解決よりもタグディスパッチの利点
これらはどちらもコンパイル時のプロセスですか?だから私が推測する「パフォーマンス勝者」はいけません。そして、すべてのタグディスパッチケースはある程度、(複数の型を追加することによって)通常のオーバーロードに書き直し/リファクタリングすることができますか?
候補を選択して選択するさまざまな方法とは別に、なぜ過負荷解決よりもタグディスパッチが優先されるべきですか?
プレーンでシンプル:通常の過負荷解決よりもタグディスパッチの利点は何ですか?通常の過負荷解決よりもタグディスパッチの利点
これらはどちらもコンパイル時のプロセスですか?だから私が推測する「パフォーマンス勝者」はいけません。そして、すべてのタグディスパッチケースはある程度、(複数の型を追加することによって)通常のオーバーロードに書き直し/リファクタリングすることができますか?
候補を選択して選択するさまざまな方法とは別に、なぜ過負荷解決よりもタグディスパッチが優先されるべきですか?
Tag dispatching
は基本的に正しいオーバーロード機能を見つけるために使用される技術に与えられた名前です。だから、技術的には過負荷だけです。 Boostサイトからそれを置くために
:
タグのディスパッチは、タイプのプロパティに基づい を派遣するのオーバーロード機能を使用する方法であり、多くの場合、 特性クラスと手をつないで使用されています。
これは標準ライブラリalgorithm
ヘッダーファイルで使用されています。例のために、双方向アクセス(list
)を提供するコンテナよりもランダムアクセス(例えばvector
)を提供するコンテナで、より効率的に実行できるアルゴリズムAlgoX
があると考えてください。だから、あなたが見ることができるように1がiterator_traits
template <typename Iter>
void AlgoXImpl(Iter first, Iter last, bidirectional_iterator_tag) {
//.....Algo specialized to bidirectional iterators
}
template <typename Iter>
void AlgoXImpl(Iter first, Iter last, random_access_iterator_tag) {
//.....Algo specialized to random access iterators
}
template <typename Iter>
void AlgoX(Iter first, Iter last) {
if (first == last) return;
AlgoXImpl(first, last, typename iterator_traits<Iter>::iterator_category());
}
を使用して派遣タグを使用しますiterator type
に基づくアルゴリズムを選択するための、シンプルな心に、これはカテゴリが、本質的に異なるタイプのよう演算子オーバーロードの一例に過ぎません。
実際の世界の例では、std::rotate
がどのように実装されているかをチェックアウトすることができます。
タグディスパッチが頻繁に使用されているという事実はなぜ使用されているのかという質問には全く答えられません。 OPは、彼のコントロール下で型階層内の単純なメソッドのオーバーロードによって、その効果が容易に達成できることを正しく示しています。したがって、決定的な議論は実際に型定義から切り離されたカスタムディスパッチスキームを実装することです。下の私の答えを見てください。 –
私の答えの要点は基本的に最初の4-5行で、STLで使われているわけではありません。 – Arunmu
この回答を補完する大きな質問:**は、通常のオーバーロードよりも少し速いですか?**私はコンパイル時に両方とも実装されているからではないと思いますが、私は依然として確信しています。 – Dean
タグは、基本プリミティブタイプを含めて、適切な特性クラスを介してタイプに関連付けることができます。たとえば、ポインタ型をイテレータ概念のサブクラスにすることは不可能です。しかし、テンプレート化された形質クラスは、それを所望のタグに関連付けることができる。したがって、タグベースのディスパッチは、関連するタイプによって定義されていないディスパッチ方式を構築することを可能にする柔軟性を追加する。
オーバーロードによるタグベースのディスパッチ – Arunmu