Как я могу это сделать? (Следующий код НЕ работает, но я надеюсь, что он объясняет идею.)
class MyClass
{
....
private:
int ToBeCalled(int a, char* b);
typedef (MyClass::*FuncSig)(int a, char* b);
int Caller(FuncSig *func, char* some_string);
}
Я хочу позвонить вызывающему абоненту примерно так:
Caller(ToBeCalled, "stuff")
И пусть Caller
вызовет ToBeCalled
с любыми параметрами, которые, по его мнению, необходимо передать. Если это вообще возможно, я хочу, чтобы все было инкапсулировано в частной части моего класса. На самом деле у меня было бы около 50 функций, таких как ToBeCalled
, поэтому я не вижу способа избежать этого.
Спасибо за любые предложения. :)
2 ответа
Вы почти там. Вам не хватает возвращаемого типа из typedef, он должен быть
typedef int (MyClass::*FuncSig)(int, char*);
Теперь вам просто нужно правильно его использовать:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
Вы хотите передать простые экземпляры FuncSig
, а не FuncSig*
- FuncSig*
- это указатель на указатель на функцию-член с дополнительным ненужным уровнем косвенности. Затем вы используете оператор со стрелкой-звездочкой (не официальное название), чтобы вызвать его:
(object_to_be_called_on ->* func)(args);
Для объектов, не являющихся указателями (например, объектов в стеке или ссылок на объекты), вы используете оператор точка-звезда:
MyClass x;
(x .* func)(args);
Кроме того, будьте осторожны с приоритетом операторов - операторы «стрелка-звезда» и «точка-звезда» имеют более низкий приоритет, чем вызовы функций, поэтому вам нужно поставить дополнительные круглые скобки, как я сделал выше.
Я предполагаю, что вы уже пробовали Caller(MyClass::ToBeCalled, "stuff")
, но есть ли какая-то особая причина, по которой вам нужен указатель на функцию? Также опубликуйте фактическую ошибку компилятора.
Caller
в этом случае - это тестирование различных форматов версий, а ToBeCalled
- фактические функции чтения, которые интерпретируют дефолтность и тому подобное. По крайней мере, все форматы имеют один и тот же интерфейс. :)
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .