これをしないでください。一般的なインターフェースを作成しないでください。これには多くの欠点があります。Int と String のように、IComparable から派生した 2 つのクラスが互いに比較できない場合はどうなるでしょうか。
テンプレートを使用できると言いました。それらを使用して、Comparator を 2 番目のテンプレート引数として指定します。
template <class T, class Comparator>
class BSTree {
public:
bool present(const T& value)
{
int res = comparator(value, root->value);
switch(res) {
case 0: return true;
case -1: return find(root->left, value);
case 1: return find(root->right, value);
}
}
private:
struct Node {
...
};
Node* root;
Comparator comparator;
};
典型的なコンパレータは次のとおりです。
template <class T>
class RawComparator {
public:
int operator()(const T& l, const T& r)
{
if (l < r) return -1;
else if (l > r) return 1;
else return 0;
}
};
そしてintの二分探索木:
typedef BSTree<int, RawComparator<int>> BSTreeInt;