Я думаю, что вы все еще можете решить свою проблему с помощью указателя на указатель на функцию, но это немного неуклюже, так как вы должны вызывать этот указатель-указатель иначе, чем вы делаете с «обычным» указателем на функцию. Вызов будет выглядеть как (*(aButton.onRightClick))()
, и вам нужно позволить onRightClick
указывать на объект-указатель, указывающий на функцию, а не назначать функцию напрямую.
Я полагаю, вы ищете способ определить это onRightClick
по умолчанию «наследует» поведение onClick
, если пользователь не переопределит это и не назначит другое поведение для onRightClick
. Я вижу два требования, которым должно соответствовать возможное решение:
1) Если onRightClick
не было переопределено, оно должно наследовать каждое изменение, сделанное в onClick
2) Если onRightClick
переопределяется, отделяется от onClick
.
Вы можете решить это с помощью «простых» указателей на функции, назначив onRightClick
функцию, которая просто вызывает функцию, назначенную для onClick
. Следующий код показывает это для C ++; подход может быть перенесен в C (хотя затем необходимо передать «this» в функцию, вызывающую onClick
:
void defaultOnClick() {
std::cout << "defaultOnClick" << std::endl;
}
void otherClick() {
std::cout << "otherClick" << std::endl;
}
void rightClick() {
std::cout << "rightClick" << std::endl;
}
typedef std::function<void(void)> onClickFunctionType;
struct ConfigButton {
onClickFunctionType onClick = defaultOnClick;
onClickFunctionType onRightClick = [this](){ this->onClick(); };
} ;
int main() {
ConfigButton configButton;
std::cout << "default for both onClick and onRightClick (calling onClick)" << std::endl;
configButton.onClick();
configButton.onRightClick();
std::cout << "special click for onClick; 'inherited' by onRightClick" << std::endl;
configButton.onClick = otherClick;
configButton.onClick();
configButton.onRightClick();
std::cout << "special click for onClick; different one for onRightClick" << std::endl;
configButton.onRightClick = rightClick;
configButton.onClick();
configButton.onRightClick();
}
Выход:
default for both onClick and onRightClick (calling onClick)
defaultOnClick
defaultOnClick
special click for onClick; 'inherited' by onRightClick
otherClick
otherClick
special click for onClick; different one for onRightClick
otherClick
rightClick