Вы можете создать интерфейс. Например,
struct A {}; // As you have defined
void set_b_for_A(struct A, int) {} // function that works with A
// interface
struct helper {
void *ptr; // pointer to your structs variants (A, ...)
void (*set_b)(struct helper *, int); // helper to dispatch to correct worker
};
void set_b_helper_for_A(struct helper *pointer, int i) { // helper for worker A
struct A *s = (struct A *) pointer->ptr;
set_b_for_A(*s, i);
}
struct helper helper_A {/* A struct */, set_b_helper_for_A};
Теперь ваш API
void set_b(struct helper *ptr, int i) {
ptr->set_b(ptr, i);
}
и вы звоните, например:
set_b(&helper_A, 0);
Сделайте то же самое для других структур
Еще некоторые примечания от MSDN
Этот метод используют самосозерцательный вид (introsort) алгоритм следующим образом:
, Если размер раздела меньше чем 16 элементов , он использует алгоритм сортировки .
вставки, Если количество [1 113] разделы превышают 2 * LogN, где N является диапазоном входного массива, он использует алгоритм Пирамидальной сортировки .
Иначе , это использует алгоритм Quicksort .
Эта реализация выполняет нестабильный вид; то есть, если два элемента равны, их порядок не мог бы быть сохранен. Напротив, стабильный вид сохраняет порядок элементов, которые равны.
Для массивов, которые отсортированы при помощи алгоритмов Heapsort и Quicksort в худшем случае, этот метод является O (n, регистрируют n), операция, где n является длиной.
Примечания Вызывающим сторонам Платформа.NET 4 и более ранние версии использовала только алгоритм Quicksort. Quicksort определяет недопустимые компараторы в некоторых ситуациях, в которых операция сортировки выдает исключение IndexOutOfRangeException и выдает исключение ArgumentException вызывающей стороне. Начиная с Платформы.NET 4.5, возможно, что сортировка операций, которые ранее бросили ArgumentException, не выдаст исключение, потому что вид вставки и пирамидально сортирует алгоритмы, не обнаруживают недопустимый компаратор. По большей части это относится к массивам меньше чем с 16 элементами.