Как изменить свойство объекта на основе параметра функции C ++ - PullRequest
1 голос
/ 04 августа 2020

У меня есть функция:

int bitCpy(Inst a, int b, int c, int d)
{
    int range = d - c;
    b <<= (32 - d);
    b >>= (32 - range);
    a.(PROPERTY HERE) = b; // a.num1, a.num2, a.num3 ... etc
    return a;
}

Функция просто копирует биты из одного раздела целого числа, а затем сдвигает эти биты в начало. Inst - это структура, содержащая разные целочисленные значения. Я хочу, чтобы функция установила a (объект) равным b. Однако я хочу, чтобы он работал на основе параметра, определяющего свойство объекта, которое нужно установить. Причина этого в том, что я хочу, чтобы поведение отличалось в зависимости от устанавливаемого свойства.

Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 04 августа 2020

Вы можете использовать указатель на член , например:

int bitCpy(Inst &a, int Inst::*member, int b, int c, int d)
{
    int range = d - c;
    b <<= (32 - d);
    b >>= (32 - range);
    a.*member = b; // a.num1, a.num2, a.num3 ... etc
    return a;
}

А затем вы можете назвать его так:

Inst i;
bitCpy(i, &Inst::num1, ...);
bitCpy(i, &Inst::num2, ...);
...

Live Demo

Однако простой указатель int* также будет работать, например:

int bitCpy(int *field, int b, int c, int d)
{
    int range = d - c;
    b <<= (32 - d);
    b >>= (32 - range);
    *field = b;
    return a;
}
Inst i;
bitCpy(&(i.num1), ...);
bitCpy(&(i.num2), ...);
...

Live Demo

Или ссылка int&, например:

int bitCpy(int &field, int b, int c, int d)
{
    int range = d - c;
    b <<= (32 - d);
    b >>= (32 - range);
    field = b;
    return a;
}
Inst i;
bitCpy(i.num1, ...);
bitCpy(i.num2, ...);
...

Live Demo

1 голос
/ 04 августа 2020

Просто используйте if?

struct Thing {
  int one;
  int two;
};

void SetIt(Thing & t, bool select, int value)
{
  if (select) t.one = value;
  else t.two = value;
}

Если у вас есть несколько «свойств» (правильный термин - элементы данных), которые являются просто пронумерованными версиями (num1, num2, ...), тогда массив создает наверное смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...