#include <boost/static_assert.hpp>
template <typename K>
class DefaultComparer
{
public:
static bool compare(K k1, K k2)
{ return k1 == k2; }
};
template <typename K>
class MyComparer : public DefaultComparer<K>
{
public:
static bool compare(K k1, K k2)
{ return k1 <= k2; }
};
template <typename K>
class InvalidComparer
{
public:
static bool bar(K k1, K k2)
{ return k1 != k2; }
};
template <typename K, template <typename K> class Comparer = DefaultComparer >
class AVLTree
{
K k1, k2;
public:
AVLTree() : k1(0), k2(0) { }
bool foo();
};
template <typename K, template <typename K> class Comparer>
bool AVLTree<K, Comparer>::foo()
{
return Comparer<K>::compare(k1, k2);
}
int main(int argc, char *argv[])
{
AVLTree<int> avltree;
AVLTree<int, MyComparer> avltree2;
AVLTree<int, InvalidComparer> avltree3;
avltree.foo();
avltree2.foo();
avltree3.foo(); // fails to compile
}