previous page
next page

Function Templates

Classes are not the only thing that can be parameterized; functions can be, too. The canonical example is the min function:

inline long min(long a, long b) { return (a < b ? a : b); }
inline float min(float a, float b) { return (a < b ? a : b); }

Because the code is the same for both overloaded min implementations, there's no reason not to make it into a template:

template <typename T>
inline T min(T a, T b) { return (a < b ? a : b); }

When the template is instantiated, the compiler generates the code on demand based on the use:

void main() {
  // produces: long min(long, long)
  long a = 1, b = 2, c = min(a, b);

  // produces: float min(float, float)
  float x = 1.1, y = 2.2, z = min(x, y);

  // produces: char *min(char *, char *)
  char *r = "hello", *s = "world", *t = min(r, s);
}

Notice that the compiler can figure out how to insatiate the min template implementation without any fancy angle brackets. However, also notice that sometimes, just as with class templates, function templates don't expand the way we'd like. For example, the min that takes two char* compares two pointer values, not the contents of the strings. A function template can be specialized by merely providing an implementation that takes the types involved:

inline char* min(const char* a, const char* b) {
  return (strcmp(a, b) < 0 ? a : b);
}

In this case, because a version of the function that takes two character pointers already exists, the compiler binds to that one instead of generating another implementation based on the min function template.


previous page
next page
Converted from CHM to HTML with chm2web Pro 2.75 (unicode)