// --------------------
// FunctionPointers.c++
// --------------------

#include <cassert>  // assert
#include <iostream> // cout, endl

template <typename T>
T my_plus (T x, T y) {
    return x + y;}

template <typename T>
T my_multiplies (T x, T y) {
    return x * y;}

template <typename FP>
int f (const FP p, int i, int j) {
    return p(i, j);}

int main () {
    using namespace std;
    cout << "FunctionPointers.c++" << endl;

    assert(my_plus(2, 3)       == 5);
    assert(my_multiplies(2, 3) == 6);

    {
    int (*p) (int, int) = &my_plus;
    assert((*p)(2, 3) == 5);
    p = my_multiplies;
    assert(  p(2, 3)  == 6);
    }

    typedef int (*IFP) (int, int);

    {
    IFP p = my_plus;
    assert(p(2, 3)  == 5);
    p = &my_multiplies;
    assert((*p)(2, 3)  == 6);
    }

    assert(f(&my_plus<int>,       2, 3) == 5);
    assert(f( my_plus<int>,       2, 3) == 5);
    assert(f(&my_multiplies<int>, 2, 3) == 6);
    assert(f( my_multiplies<int>, 2, 3) == 6);

    {
    IFP p = my_plus;
    assert(f( p, 2, 3) == 5);
    p = my_multiplies;
    assert(f( p, 2, 3) == 6);
    }

    cout << "Done." << endl;
    return 0;}


syntax highlighted by Code2HTML, v. 0.9.1