Есть ли способ объединить несколько почти одинаковых функций? - PullRequest
2 голосов
/ 20 октября 2019

Аппаратные средства,
Требуются прерывания void(*)() - статическая функция

Поэтому, если я хочу, чтобы прерывание вызывало члены определенного объекта T t, мне нужно создать несколько T* t_star для статической функции void foo(){ t_star->whatever;} для ссылки.
Если мне нужно несколько прерываний, мне нужно иметь несколько таких пар function-global_pointer

T* t_star_1;
void foo_1() {t_star_1->whatever;}
T* t_star_2;
void foo_2(){t_star_2->whatever;}
...

Как вы можете видеть, это приводит к тому, что код становится слишком похожим
Теперь объединение T* очевидно - T* Array[5]

Как мне сделать то же самое для функций? Теперь они отличаются только индексом одного массива ... Есть ли способ не писать каждый из них?

1 Ответ

1 голос
/ 20 октября 2019

Они [функции] теперь отличаются только индексом одного массива ...

Похоже на то, какие шаблоны предназначены для обработки.

template <unsigned Index>
void foo()
{
    Array[Index]->whatever;
}

Ваши обратные вызовытогда будет foo<0>, foo<1> и т. д. (Странно, что эти обратные вызовы не принимают параметров, хотя. По моему опыту, этот вид API часто позволяет параметру void* передавать данные в обратный вызов, так что выне нужно прибегать к глобальным переменным.)

Вот еще одна возможность, в зависимости от того, как вы планировали заполнить свой массив. Предполагается, что вы можете инициализировать Array[i] возвращаемым значением get_data(i). Преимущество в том, что глобальные переменные не требуются.

template <unsigned Index>
void foo()
{
    static T * data = get_data(Index);
    data->whatever;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...