Concrete monomorphic functions
What distinguishes an abstract algorithm from a concrete function? This is best shown by example. Let's write a function to multiply each of the elements in an array by 2:
class array_of_ints { int data[10] = {}; public: int size() const { return 10; } int& at(int i) { return data[i]; } }; void double_each_element(array_of_ints& arr) { for (int i=0; i < arr.size(); ++i) { arr.at(i) *= 2; } }
Our function double_each_element
works only with objects of type array_of_int
; passing in an object of a different type won't work (nor even compile). We refer to functions like this version of double_each_element
as concrete or monomorphic functions. We call them concrete because they are insufficientlyabstract for our purposes. Just imagine how painful it would be if the C++ standard library provided a concrete sort
routine that worked only on one specific data type!