typedef для функции

224
17 декабря 2019, 03:40

Хочу создать ссылку на функцию так как очень длинная цепочка вызова каждый раз.

typedef void(*PlayerVP)(FVector&, FRotator&);
PlayerVP VP = &GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint;

В итоге ошибка:

error C2276: '&': illegal operation on bound member function expression

Если забрать амперсанд, тогда другая ошибка:

error C3867: 'APlayerController::GetPlayerViewPoint': non-standard syntax; use '&' to create a pointer to member

Сигнатура самой функции GetPlayerViewPoint:

void AController::GetPlayerViewPoint( FVector& out_Location, FRotator& out_Rotation ) const
Answer 1

Указатели на функции нельзя использовать с нестатическими методами ("функциями членами класса").

А как заметили в комментариях, использовать указатели-на-члены-класса здесь смысла нет. С ними код не особо короче.

auto mem_ptr = &AController::GetPlayerViewPoint;
(GetWorld()->GetFirstPlayerController()->*mem_ptr)(x, y);

Лучше использовать другой вариант - сохранить ссылку на последний объект в цепочке:

auto &con = *GetWorld()->GetFirstPlayerController();
con->GetPlayerViewPoint(x, y);

Или сделать лямбду:

auto vp = [&](FVector &x, FRotator &y)
{
    GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(x, y);
};
vp(x, y);
READ ALSO
thread detach - закрывается окно

thread detach - закрывается окно

Вопрос странный конечно, но почему-то закрывается окно, созданное с detach после закрытия приложения которое его создалоЧто-то с сигналами?

185
Как установить LLVM_ROOT для emscripten?

Как установить LLVM_ROOT для emscripten?

У меня Linux UbuntuУстановил emsdk

217
Как заставить SeekBar отображаться правильно?

Как заставить SeekBar отображаться правильно?

Пишу простенькое приложение для плавного изменения уровня подсветки экрана(фактически аналог того, что есть в настройках)SeekBar на экране...

201