Vielleicht nicht die idiomatischste Implementierung, aber durchaus von einem gewissen Unterhaltungswert — Church-Numerale in C++0x:

#include <cstdlib>
#include <functional>
#include <iostream>

using namespace std;

template <typename T>
struct church {
  // ----- Typen -----
  typedef function<T(T)>         fn;
  typedef function<fn(const fn)> numeral;

  // ----- Null und Nachfolger -----
  static fn zero(const fn f) {
    return [](T x) -> T {
      return x;
    };
  }

  static numeral succ(const numeral num) {
    return [=](const fn f) -> fn {
      const numeral num_ = num;
      return [=](const T x) -> T {
        return f(num_(f)(x));
      };
    };
  }

  // ----- Hilfsfunktionen -----
  static numeral make_numeral(unsigned int n) {
    numeral num = zero;
    for (int i = 0; i < n; i++) {
      num = succ(num);
    }
    return num;
  }
};

// ----- Hauptprogramm -----
int twice(int n) {
  return 2*n;
}

int main(int argc, char **argv) {
  auto eight = church<int>::make_numeral(8);
  auto ten = church<int>::succ(church<int>::succ(eight));
  cout << "ten(twice)(1) = " << ten(twice)(1) << endl;
  return EXIT_SUCCESS;
}

Weitere Implementierungen von Church-Numeralen gibt's bei Christoph: