C ++ Могу ли я передать выбор функции-члена в качестве аргумента? - PullRequest
2 голосов
/ 24 марта 2019

У меня есть класс с двумя функциями-членами getA и getA2, которые выполняют аналогичные функции. Они оба возвращают int после внутреннего вычисления, которое может отличаться.

В функции printStuff я вызываю оба, но на самом деле я хочу вызвать только один из них, но не называя его в printStuff. Я хочу дать printStuff информацию о том, какую функцию-член класса A использовать в своем теле в качестве аргумента для printStuff каким-либо образом.

class A {
public:
  A(int a) : m_a(a) {;}
  int getA() {
    return m_a;
  };
  int getA2() {
    return 2*m_a;
  };

private:
  int m_a = 0;

};

void printStuff(/*tell me which member fcn to use*/) {
  A class_a(5);

  //I actually just want to call the last of the 2 lines, but define somehow
  //as an argument of printStuff which member is called
  cout << "interesting value is: " << class_a.getA() << endl;
  cout << "interesting value is: " << class_a.getA2() << endl;
  cout << "interesting value is: " << /*call member fcn on class_a*/ << endl;
}

int functional () {

  printStuff(/*use getA2*/); //I want to decide HERE if getA or getA2 is used in printStuff
  return 0;
}

Можно ли это как-нибудь сделать? Из прочтения указателей на функции я не уверен, как правильно применить это здесь.

1 Ответ

4 голосов
/ 24 марта 2019

Вы можете выполнить необходимую параметризацию, передав указатель функции-члену .

void printStuff( int (A::* getter)() ) {
  A class_a(5);

  cout << "interesting value is: " << (a.*getter)() << endl;
}

// in main
printStuff(&A::getA2);

Синтаксис объявления int (A::* getter)() немного сложен в истинном C ++ стиле, но именно так вы используете необработанную функцию указателя на член в сигнатуре функции. Псевдоним типа может немного упростить синтаксис, поэтому стоит помнить об этом. И я думаю, &A::getA2 довольно очевидно.

Также помните о скобках в (a.*getter)(), так как это требуется для приоритета операторов.

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