The idea behind this was, I wanted to write a function that will take two parameters of the same type as a parameter and then it will swap them. It is a kind of generic swap but without the use of a C++ template. So the best way of doing it using "void *" as a parameter. As we know "void *" represents any arbitrary type that actually eases my job of writing a generic swap function.
So, the function signature can be like below:
void swap(void *arg1, void *arg2);"void *" points to the starting address of the arbitrary location in the memory, irrespective of the bit pattern. Try to write the function like the below:
void swap(void *arg1, void *arg2) { void temp = *arg1; arg1 = *arg2; *arg = temp; }Oops, this is full of errors.
1. We can't declare a variable of type "void". 2. "void *" can't be dereferenced. 3. We also interested in swapping values. So, number of bytes making up the values to be passed as parameter.Here is the functional version of the swap function.
void swap(void *arg1, void *arg2, int size) { char *buffer = new char[size]; memcpy(buffer, arg1, size); memcpy(arg1, arg2, size); memcpy(arg2, buffer, size); delete []buffer; }How do we going to use this function from our client code? We can do it like below: (I have used vc++, 2005)
int _tmain(int argc, _TCHAR* argv[]) { int one = 1; int two = 2; swap(&one, &two, sizeof(int *)); cout << one << ":" << two << endl; char *n = _strdup("World"); char *t = _strdup("Hello"); swap(&n, &t, sizeof(char *)); cout << n << ":" << t << endl; return 0; }and the output is like below: Please remember to pass the same type of parameter always as above. Avoid trying to pass arguments like:
int one = 1; short two = 2; swap(&one, &two, sizeof(short *));The advantage of this over the template is the same assembly code being used for multiple calls as opposed to a template, which creates a separate copy for each call.
Comments