#c #member-functions
#c #функции-члены
Вопрос:
У меня есть класс с двумя функциями-членами getA
и getA2
, которые выполняют аналогичную функцию. Они оба возвращают значение int после внутренних вычислений, которые могут отличаться.
В функции printStuff
я вызываю обе, но на самом деле я хочу вызвать только одну из них, но без указания ее имени в printStuff
. Я хочу каким-то printStuff
образом предоставить printStuff
информацию о том, какую функцию-член класса A использовать в его теле в качестве аргумента.
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:
Вы можете выполнить требуемую параметризацию, передав указатель на функцию-член.
void printStuff( int (A::* getter)() ) {
A class_a(5);
cout << "interesting value is: " << (a.*getter)() << endl;
}
// in main
printStuff(amp;A::getA2);
Синтаксис декларатора int (A::* getter)()
немного шаткий в истинном стиле C , но именно так вы используете необработанный указатель на функцию-член в сигнатуре функции. Псевдоним типа может немного упростить синтаксис, поэтому стоит помнить об этом. И я думаю, amp;A::getA2
это не требует пояснений.
Также помните о круглых скобках в (a.*getter)()
, поскольку этого требует приоритет оператора.