How to make generic function using void * in c?

后端 未结 7 2286
广开言路
广开言路 2020-12-13 07:48

I have an incr function to increment the value by 1 I want to make it generic,because I don\'t want to make different functions for the same functi

7条回答
  •  [愿得一人]
    2020-12-13 08:24

    You can't do exactly what you're asking - operators like increment need to work with a specific type. So, you could do something like this:

    enum type { 
        TYPE_CHAR,
        TYPE_INT,
        TYPE_FLOAT
    };
    
    void incr(enum type t, void *vp)
    {
        switch (t) {
            case TYPE_CHAR:
            (*(char *)vp)++;
            break;
    
            case TYPE_INT:
            (*(int *)vp)++;
            break;
    
            case TYPE_FLOAT:
            (*(float *)vp)++;
            break;
        }
    }
    

    Then you'd call it like:

    int i=5;
    float f=5.6f;
    char c='a';
    
    incr(TYPE_INT, &i);
    incr(TYPE_FLOAT, &f);
    incr(TYPE_CHAR, &c);
    

    Of course, this doesn't really give you anything over just defining separate incr_int(), incr_float() and incr_char() functions - this isn't the purpose of void *.

    The purpose of void * is realised when the algorithm you're writing doesn't care about the real type of the objects. A good example is the standard sorting function qsort(), which is declared as:

    void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
    

    This can be used to sort arrays of any type of object - the caller just needs to supply a comparison function that can compare two objects.

    Both your swap() and sort() functions fall into this category. swap() is even easier - the algorithm doesn't need to know anything other than the size of the objects to swap them:

    void swap(void *a, void *b, size_t size)
    {
        unsigned char *ap = a;
        unsigned char *bp = b;
        size_t i;
    
        for (i = 0; i < size; i++) {
            unsigned char tmp = ap[i];
    
            ap[i] = bp[i];
            bp[i] = tmp;
        }
    }
    

    Now given any array you can swap two items in that array:

    int ai[];
    double ad[];
    
    swap(&ai[x], &ai[y], sizeof(int));
    swap(&di[x], &di[y], sizeof(double));
    

提交回复
热议问题