全長約1.2 - 1.7メートル、頭骨長約20 - 23センチメートル。頭骨は長く、厚みがある構造である。歯数は28本。上顎にはサーベル状、下顎には釘状の犬歯を持つ。この特徴はスミロドンに似た特徴である。同様にこの牙を獲物に打ち込むために顎は120度まで大きく開き、頸椎には筋肉の付着点が発達していた。また、獲物を押さえるための前肢も強力である。しかし最大の相違点は、この牙が一生伸び続ける無根歯だということである。このため、万一牙を折損したとしても、餓死に至る可能性は少なかったと推定されている。また通常哺乳類が毛繕いなどに用いている切歯を持っておらず、歯列は犬歯と臼歯のみであった。外観上目立った相違点では、顎先近くの下顎骨が下方に伸び、サーベル犬歯を保護する「鞘」のようになっていたことが挙げられる。ただしこの「鞘」はスミロドンには存在しないが、それ以前のマカイロドゥスは持っていた。それ以外の骨格上の相違点では、スミロドンに比べると眼窩は小さく、後端は閉じている。また、有袋類であるために、上恥骨が存在した。
C++では、クラスあるいは構造体において関数呼び出し演算子の多重定義が可能となっている。具体的には、任意の引数を持つoperator()メンバー関数を定義することで、そのオブジェクトのインスタンスを指す変数の名前が、あたかも関数名（関数指示子）であるかのような構文で、定義した関数を呼ぶことができる。このような C++ のオブジェクトを、C++ の用語ではファンクタ (functor) と呼ぶ（#C++のファンクタとファンクショノイド を参照）。struct my_adder {    int operator()(int a, int b) const {        return a + b;    }};my_adder f;int result = f(2, 3);// 以下のように呼び出すことも可能だが、通例使われない。f.operator()(2, 3);C++のclass/structは、デフォルトのアクセスレベル（アクセス修飾子）がprivate/publicであるという違いしかないため、関数オブジェクトの記述ではclassの代わりにstructが使われることも多い。配列の中から特定の条件に該当する要素の個数を数えるルーチンの例を考えてみよう。ただし条件の判定処理は自由にカスタマイズできるものとする。関数へのポインタを使用する C のプログラムは、たとえば下記のようになる。#include <stdio.h>/* 引数が条件に該当する場合は 1 を、該当しない場合は 0 を返す */typedef int PredicateFunc(int x);size_t countIf(const int data[], size_t num, PredicateFunc* predicate) {    size_t count = 0;    size_t i;    for (i = 0; i < num; ++i) {        if (predicate(data[i])) { count++; }    }    return count;}int isPositive(int x) {    return x > 0;}int isEven(int x) {    return x % 2 == 0;}int main(void) {    const int data[] = { 0, 1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4 };    printf("Count of positive numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), &isPositive));    printf("Count of even numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), &isEven));}一方、C++の関数オブジェクトを利用すると下記のようになる。#include <cstdio>template<typename TPredicate> size_t countIf(const int data[], size_t num, TPredicate predicate) {    size_t count = 0;    for (size_t i = 0; i < num; ++i) {        if (predicate(data[i])) { count++; }    }    return count;}struct IsPositiveFunctor {    bool operator()(int x) const { return x > 0; }};struct IsEvenFunctor {    bool operator()(int x) const { return x % 2 == 0; }};int main() {    const int data[] = { 0, 1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4 };    std::printf("Count of positive numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), IsPositiveFunctor()));    std::printf("Count of even numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), IsEvenFunctor()));}コールバックを述語 (predicate) として countIf() 関数テンプレートに渡す際、関数へのポインタではなく構造体のインスタンス（関数オブジェクト）を渡していることに注意されたい。上記の例において関数オブジェクトによるカスタマイズを可能にしているのは、テンプレートと関数呼び出し演算子のオーバーロードによる静的ダック・タイピングである。関数テンプレートを実体化する際の字句解析に適合しさえすれば、述語にはどんなオブジェクトでも渡せる。コールバック関数が実行されると、他のメンバー関数と同様に働き、すなわちオブジェクトの他のメンバー（データや関数）に対して完全にアクセスすることができる。クラス型の関数オブジェクトに加えて、C++ では別の種類の関数オブジェクトが可能である。C++ のメンバーポインタや、テンプレート機能を利用することができ、テンプレートの記述力により、(関数の合成などの)別種の関数オブジェクトを定義するといったいくつかの関数型言語の技法を用いることができる。C++ の Standard Template Library (STL) では、テンプレートの述語 (predicate) として関数オブジェクトを多用している。