指向c的成员的指针

问题描述 投票:0回答:1

我想按特定字段的值对结构进行排序。字段中的数据类型相同。在c ++中,我使用了指向成员的指针,以避免为不同的字段重写相同的排序。

#include<string.h>

typedef struct {
    int id;
    int year;
    int price;
} example_struct;

void sort_arr(example_struct a[5], const char* usr_field) {
    int example_struct::*field = nullptr;

    if (strcmp(usr_field, "id") == 0)
        field = &example_struct::id;
    else if (strcmp(usr_field, "year") == 0)
        field = &example_struct::year;
    else if (strcmp(usr_field, "price") == 0)
        field = &example_struct::price;

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5 - i; j++) {
            if (a[j].*field > a[j + 1].*field) {
                buff = a[j];
                a[j] = a[j+1];
                a[j+1] = buff;
            }
        }
    }
}

int main {
    example_struct a[5];

    fill_arr(a); //somehow filling the array
    sort_arr(a,"year");
}

我想知道,是否可以在C上模拟此代码以及如何执行此操作

c
1个回答
0
投票

您应该可以使用offsetof宏获取要复制的成员的偏移量。请注意,您将不会获得该成员的任何类型信息,而只会获得结构体的偏移量,因此您将需要确保您知道成员字段的大小。

因此,您可以进行比较:

void sort_arr(example_struct a[5], const char* usr_field) {
    size_t offset;
    if (strcmp(usr_field, "id") == 0)
        offset = offsetof(example_struct, id);
    else if (strcmp(usr_field, "year") == 0)
        offset = offsetof(example_struct, year);
    else if (strcmp(usr_field, "price") == 0)
        offset = offsetof(example_struct, price);

    ...
    if (*((int*)((char*)&a[j])+offset) > *((int*)((char*)&a[j+1])+offset)) {
        ...
© www.soinside.com 2019 - 2024. All rights reserved.