Класический пример сравнения двух переменных с предикатом:
Два предиката:
template<class T>
class CMPLess
{
public:
bool operator() (T a, T b) { return a<b; }
};
template<class T>
class CMPEqual
{
public:
bool operator() (T a, T b) { return a==b; }
};
Функция сравнения:
template<class T, class CMP>
bool equal_if(T a, T b, CMP cmp)
{
return cmp(a,b);
}
Вызов:
int a=2, b=3;
if (equal_if(a, b, CMPLess<int>()))
{
// a<b
}
else
if (equal_if(a, b, CMPEqual<int>()))
{
// a==b
}
В этом примере не только типы не определены, так еще и действие, которое производится в функции equal_if, неизвестно пока не будет вызова этих функций.
UPD: Обновление для того, чтобы минимизировать упоминание типов. В примере выше передается параметром CMPEqual<int>(), спрашивается зачем указывать тип явно, если его можно вывести неявно из типа переменных a и b. Вот как это можно сделать:
Меняем функцию сравнения:
template<template<class> class CMP, class T>
bool equal_if(T a, T b)
{
return CMP<T>()(a,b);
}
Вызов меняется так, что явно типы указываются только при создании переменных:
int a=2, b=3;
if (equal_if<CMPLess>(a, b))
{
// a<b
}