With a math template, you usually need access to a wealth of calculations but may only use one or two of those calculations at a time. For example, if someone is calculating your mortgage, he or she doesn’t need to know the amortization calculation. However, the person might need the amortization calculation when working with the next customer.
In short, the calculations all have a purpose and you need them all, but you don’t need them all at the same time. Because of the way you use math templates, they work best as a series of function templates. The MathTemplate example shows how to create the series of functions.
#include <iostream> #include <cmath> using namespace std; template<typename T> T Area(T height, T length) { return height * length; } const double PI = 4.0*atan(1.0); template<typename T> T CircleArea(T radius) { double result; result = PI * radius * radius; // This version truncates the value. return (T)result; } template<typename T> T TriangleArea(T base, T height) { double result; result = base * height * 0.5; return (T)result; } int main() { cout << "4 X 4 Areas:" << endl; cout << "Square: " << Area<int>(4, 4) << endl; cout << "Circle: " << CircleArea<int>(2) << endl; cout << "Triangle: " << TriangleArea<int>(4, 4) << endl; cout << "Using a value of pi of: " << PI << endl; return 0; }
The calculations could consist of any math calculation — the point of the example is that using functions makes each of the calculations discrete, easy to use, and easy to manage. When you run this example, you see the following output:
4 X 4 Areas: Square: 16 Circle: 12 Triangle: 8 Using a value of pi of: 3.14159
Note that CircleArea
For consistency, you could change the circle equation to read like this:
radius = radius / 2; result = PI * radius * radius;
Dividing the input by 2, essentially changing the diameter to a radius, means that you could call the equation using the same number as all the other area calculations: CircleArea
You should also note that the circle and triangle calculations perform a bit of type coercion to ensure that the user gets the expected results back by modifying the return statement to read return (T)result;. The type conversions are needed to keep your templates from generating warning messages. It’s important to note that the approach used in the example truncates the result when the template returns an int.