コアとなるダイナミック バインディングとテンプレートは根本的に異なるものですが、同じ機能を実装するために使用できます。
コード例 (参考用)
A) 動的バインディング
namespace DB {
// interface
class CustomCode {
public:
virtual void operator()(char) const = 0;
};
class Lib {
public:
void feature(CustomCode const& c) {
c('d');
}
};
// user code
class MyCode1 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "1: " << i << std::endl;
}
};
class MyCode2 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "2: " << i << std::endl;
}
};
void use() {
Lib lib;
lib.feature(MyCode1());
lib.feature(MyCode2());
}
}
B) 汎用プログラミング
namespace GP {
//interface
template <typename CustomCode> class Lib {
public:
void feature(CustomCode const& c) {
c('g');
}
};
// user code
class MyCode1 {
public:
void operator()(char i) const {
std::cout << "1: " << i << std::endl;
}
};
class MyCode2 {
public:
void operator()(char i) const {
std::cout << "2: " << i << std::endl;
}
};
void use() {
Lib<MyCode1> lib;
lib.feature(MyCode1());
//lib.feature(MyCode2()); <-- illegal
}
}
質問
いくつかの考え
これらのパラダイムは同一ではなく、長所と短所A
があります ( の方が強力 ( を参照MyCode2
) でありB
、ユーザーにとってより柔軟です) が、両方とも同じ機能を実装できます (上記の制限が適用されます)。
とにかく、理論的には、 (TM)A
は仮想関数の間接化のために実行時に少し遅くなりますが、B
メソッドをインライン化できるため、いくつかの最適化の機会が提供されます (もちろん、間接化はありません)。ただし、実装する必要がある明確なインターフェイス (通常は複数のメソッドで構成されます) があるため、もう少し自己文書化されていると
感じることがよくありますが、もう少し無政府的です (柔軟性を意味します)。A
B
芯
- これらのパラダイムの一般的な結果/比較研究はありますか?
- スピードアップは重要ですか?
- コンパイル時間はどうですか?
- 大規模システムのインターフェースに対する設計上の意味は何ですか (私は主に
A
モジュール間インターフェースに使用しましたが、これまで本当に大きなプロジェクトを行ったことはありません)。
編集
注: 「より強力なので動的バインディングの方が優れている」と言うのは、まったく答えではありません。前提条件は、両方のアプローチが適用できる場合があるためです (そうでない場合、選択する自由はありません。少なくとも合理的ではありません)。 .