Вы можете использовать функциональную стандартную библиотеку и принять ваш аргумент как:
std::tr1::function<bool (T,U)>
есть:
#include <functional>
template<typename T, typename U>
class expression
{
public:
expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o)
{ }
operator bool{return op(val1, val2);}
private:
T val1;
U val2;
std::tr1::function<bool (T,U)> op;
};
Затем, чтобы создать выражение:
#include <functional>
expression<int, int> foo(4,3, std::tr1::bind(greater()));
Вот учебник