Функціональні об’єкти можуть працювати тільки з базовими класами С++ і з класами, для яких визначені відповідні оператори (<,>,+,-,==) Це не завжди зручно, оскільки інколи доводиться працювати з типами даних, для яких така умова не виконується. В такому випадку можна визначити власну функцію користувача для функціонального об’єкту. Наприклад, оператор < не визначений для звичайних рядків char*, але можна написати функцію, що використовує порівняння і використовувати її адресу (ім’я) замість функціонального об’єкту. Програма 15.7 показує, як просортувати масив рядків char*.
#include<iostream>
#include<conio>
#include<string>
#include<algorithm>
using namespace std;
char* names[]={"Sergij","Andrij","Ulana","Tetana","Ivan","Ivanna"};
bool alpha_comp(char*,char*); //оголошення
int main()
{ sort(names,names+6,alpha_comp); //сортування рядків
for(int j=0;j<6;j++)
cout<<names[j]<<endl;
getch();
return 0;
}
bool alpha_comp(char* s1,char* s2)
{
return(strcmp(s1,s2)<0?true:false);
}
Програма 15.7

Третім параметром алгоритму sort() в даному випадку є адреса функції alpha_comp(), яка порівнює два рядки типу char* і повертає true чи false залежно від того, чи правильно для них виконується лексиграфічне порівняння.
В даному прикладі можна було обійтися без функції користувача, замінивши рядки типу char* рядками типу string. Для типу string є вбудовані функціональні об’єкти такі як less<>() i greater<>().