Здравствуйте, Chorkov, Вы писали: D>>>средствами языка или можно использовать грязные хаки? А>>средствами языка А>>нужно из конструктора производного класса вызвать конструктор базового А>>параметры — форматная строка и переменные C>Средствами языка это невозможно.
У меня получилось вот так:
#include <stdio.h>
#include <memory>
#include <stdarg.h>
struct base
{
base (char * format, ...)
{
va_list args;
va_start(args, format);
vprintf (format, args);
va_end (args);
}
}; // basestruct x
{
char y [1024];
};
struct derived: base
{
derived (char * format, ...):
base
(
format,
* (x *) (va_start (va_, format), va_)
)
{
va_end (va_);
}
private:
va_list va_;
}; // derivedint main (int argc, char** argv)
{
derived ("argc = %d; argv [0] = %s\n", argc, argv [0]);
return 0;
} // main
Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:
Здравствуйте, Аноним, Вы писали:
А>Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:
А>
А>void foo( ... )
А>{
А> bar( ... );
А>}
А>
средствами языка или можно использовать грязные хаки?
<Подпись удалена модератором>
Re[2]: Пробросить эллипсис дальше
От:
Аноним
Дата:
20.03.09 15:14
Оценка:
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
А>>Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:
А>>
А>>void foo( ... )
А>>{
А>> bar( ... );
А>>}
А>>
D>средствами языка или можно использовать грязные хаки?
средствами языка
нужно из конструктора производного класса вызвать конструктор базового
параметры — форматная строка и переменные
D>>средствами языка или можно использовать грязные хаки? А>средствами языка А>нужно из конструктора производного класса вызвать конструктор базового А>параметры — форматная строка и переменные
Кстати, под MSVC 6 получилось без члена класса va_ и объявления типа x:
struct derived: base
{
derived (char * format, ...):
base
(
format,
* (std::pair <int, char [1024]> *)
(
va_start (* std::auto_ptr <va_list> (new va_list), format)
)
)
{
}
}; // derived
Особенности:
— std::pair формально не POD, но шестёрка спокойно просовывает его в эллипсисы
— va_start возвращает не void (там примерно так #define va_start(x,y) x = &y), поэтому катит
— va_end не вызывается из-за его тривиальности (просто присваивает 0) в шестёрочной реализации
Не могу уверенно сказать когда должен разрушиться auto_ptr по стандарту, но проверка показывает, что это происходит в правильный момент:
struct z
{
z () { printf ("z::z\n"); }
~z () { printf ("z::~z\n"); }
va_list va_;
};
struct derived: base
{
derived (char * format, ...):
base
(
format,
* (std::pair <int, char [1024]> *)
(
va_start (std::auto_ptr <z> (new z) -> va_, format)
)
)
{
}
}; // derived
Вывод этого варианта такой:
z::z
argc = 1; argv [0] = C:\Projects\testell\Debug\testell.exe
z::~z
Press any key to continue
Здравствуйте, opener, Вы писали:
А>>>Как "пробросить" эллипсис дальше?
RO>>http://wiki.rsdn.ru/ellipsis.ashx
O>Ну, здорово. А как это ипользовать для конструктора с эллипсисом?
Настоятельно попросить автора класса с конструктором с многоточием приделать этому классу также и конструктор с varargs’ами.