robvleugel Ответов: 1

Вперед функция с переменным количеством аргументов в C++


Привет ребята,

Я использую SDL в своей игре, которая имеет хорошую функцию ведения журнала под названием SDL_Log().
Я хотел бы использовать это, но предпочитаю использовать другое имя для функции (например, GameLog()). Причина в том, что если я когда-нибудь захочу добавить функциональность к этой функции ведения журнала, я могу просто сделать это в одном месте. Кроме того, если я когда-нибудь переключусь с SDL на Allegro или другую 2D-мультимедийную библиотеку, мне не придется менять это везде в своем коде.

Проблема в том, что я понятия не имею, как это сделать. Эта функция определяется следующим образом:
void SDL_Log(const char* fmt, ...)


Как я смогу это сделать?

Что я уже пробовал:

Я попробовал использовать #defines (но даже если я не могу заставить его работать, я предпочитаю не использовать для этого код пропроцессора).

Я попробовал использовать typedef, используя va_list, va_start, va_arg и т. д.
Приведенный ниже код не сработал.

void GameLog(const char* log, ...)
{
	va_list args;
	va_start(args, log);
	SDL_Log(log, args);
	va_end(args);
}



Есть ли кто-нибудь, кто имеет представление, как это сделать?
Сначала я думал, что это будет просто сделать, но я боролся с этим уже много дней.

Gerry Schmitz

Похоже, тебе нужна "обертка":

https://stackoverflow.com/questions/879408/c-function-wrapper-that-behaves-just-like-the-function-itself

robvleugel

Хм, Да, но ни одно из решений, похоже, не работает. Обычные указатели функций, например, здесь не делают трюка, так как std::function, похоже, не принимает (...).

Richard MacCutchan

Сначала вам нужно посмотреть документацию для SDL_Log, чтобы увидеть, какие параметры он ожидает.

robvleugel

Я отдал его, его:

void SDL_Log(const char* fmt, ...)

То... означает переменное число аргументов. Вот что делает это занозой в заднице для меня.

Richard MacCutchan

Но это не то, что вы пытаетесь передать.

1 Ответов

Рейтинг:
11

Richard MacCutchan

Вы можете переопределить имя функции таким образом:

#define GameLog SDL_Log

Что позволяет использовать другое имя, хотя и не добавляет функциональности.


robvleugel

Спасибо за предложение, Ричард.

У этого есть еще один недостаток: мне пришлось бы включать файл SDL.h в каждый файл кода, использующий функцию GameLog.

Richard MacCutchan

- Да, я знаю. К сожалению, нет другого простого способа сделать это, если это единственная определенная функция SDL_Log.

Richard MacCutchan

Может быть, это поможет: SDL_LogMessageV - SDL Wiki'[^].

robvleugel

Упустил из виду, что один, так как он использует список va, это может просто сработать. Я проверю это, спасибо, Ричард!

Richard MacCutchan

Похоже, что SDL_Log-это просто оболочка для SDL_LogMessageV, поэтому вам просто нужно создать свой собственный обработчик, который обеспечивает ту же функциональность.

robvleugel

Все получилось, большое спасибо, Ричард!