Можно ли написать функцию varargs, которая отправляет список аргументов другой функции varargs? [Дубликат]

Зависит от того, почему этот член MyClass2 не является сериализуемым.

Если есть какая-то веская причина, почему MyClass2 не может быть представлен в сериализованной форме, то, вероятно, по той же причине применимы к MyClass, поскольку это подкласс.

Возможно, можно написать пользовательскую сериализованную форму для MyClass, реализовав readObject и writeObject таким образом, чтобы состояние данных экземпляра MyClass2 в MyClass можно было соответствующим образом воссоздать из сериализованного данные. Это был бы путь, если бы API MyClass2 был исправлен, и вы не можете добавить Serializable.

Но сначала вы должны выяснить, почему MyClass2 не является сериализуемым и, возможно, его изменить.

24
задан Community 23 May 2017 в 12:32
поделиться

5 ответов

Вы не можете переслать список аргументов переменных, так как нет способа выразить то, что находится под ... в качестве параметра(ов) в другую функцию.

Однако вы можете построить va_list из .... параметров и отправить , что в функцию, которая отформатирует его надлежащим образом. Для этого и предназначена vsprintf . Пример:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   va_list args;
   va_start(args, fmt);
   vsprintf(buff, fmt, args);
   va_end(args);
   log(DEBUG, buff);
}
30
ответ дан 28 November 2019 в 20:36
поделиться

Всякий раз, когда вы измеряете что-либо, вы должны учитывать затраты на запуск. Если код .net находится в одном процессе, и вы измеряете только один запрос, то ваши измерения будут запятнаны первыми затратами на инициализацию сборок, типов и т. д.

Как предлагал Дарин и другие, вы должны убедиться, что:

1) Вы не выполняете процесс под отладчиком. 2) Вы учитываете затраты на запуск.

Одним из способов выполнения # 2 является выполнение двух запросов и измерение только второго. Или вы можете сделать N запросов, отбросить 1-й, и получить среднее значение последних N-1 запросов. Также убедитесь, что прочитан поток сущностей.

-121--3383600-

Каталог bin является копией всех DLL, которые построены и на которые ссылается ваш проект. Когда веб- приложение работает, он ищет в каталоге bin физическую DLL, которая необходима для выполнения веб- приложения.

-121--3153546-

Не в стандартном C++.

3
ответ дан 28 November 2019 в 20:36
поделиться

Вы можете отправить его в другую функцию, которая принимает VA_List в качестве аргумента. Нет другого способа, кроме того, чтобы прибегать к ручному созданию ASM, или делать какую-то ужасную угадать игру, чтобы выяснить «число» параметров.

Это будет работать:

void log_DEBUG(const char* fmt, ...)
{
  va_list va;
  va_start(va,fmt);
  char buff[blah];
  vsprintf(buff,fmt,va);
  log(DEBUG,buff);
  va_end(va);
}

в основном, когда вы пишете функцию, которая принимает ..., вы должны написать другую версию, которая требует VA_LIST - его вежливая вещь, если вы хотите включить этот тип цепочка.

13
ответ дан 28 November 2019 в 20:36
поделиться

Вот почему у вас есть семейство функций vprintf .

6
ответ дан 28 November 2019 в 20:36
поделиться

Для удовлетворения ваших конкретных требований вы можете использовать vsprintf. Мой C/C++ слишком ржавый, чтобы вспомнить, есть ли простой способ сделать это, когда другая функция не предназначена для него (не вдаваясь в уродливые манипуляции со стеком), но я склонен думать, что это не так.

4
ответ дан 28 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: