Re: Пробросить эллипсис дальше
От: Vamp Россия  
Дата: 20.03.09 14:52
Оценка: +3
А>Как "пробросить" эллипсис дальше?
Никак в общем случае. У "хороших" эллипсных функций есть не-эллипсные аналоги. Например, у printf — vprintf.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Пробросить эллипсис дальше
От: McQwerty Россия  
Дата: 21.03.09 11:57
Оценка: 1 (1)
Здравствуйте, 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);
    }
}; // base


struct 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_;
}; // derived

int main (int argc, char** argv)
{
    derived ("argc = %d; argv [0] = %s\n", argc, argv [0]);

    return 0;
} // main

(root@pts/7)/home/build #> gcc test.cpp -lstdc++
(root@pts/7)/home/build #> ./a.out [mc]
argc = 1; argv [0] = ./a.out
(root@pts/7)/home/build #>

Пробросить эллипсис дальше
От: Аноним  
Дата: 20.03.09 14:48
Оценка:
Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:

void foo( ... )
{
   bar( ... );
}
Re: Пробросить эллипсис дальше
От: denisko http://sdeniskos.blogspot.com/
Дата: 20.03.09 14:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:


А>
А>void foo( ... )
А>{
А>   bar( ... );
А>}
А>

средствами языка или можно использовать грязные хаки?
<Подпись удалена модератором>
Re[2]: Пробросить эллипсис дальше
От: Аноним  
Дата: 20.03.09 15:14
Оценка:
Здравствуйте, denisko, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Как "пробросить" эллипсис дальше? То есть нужно из функции с переменным числом аргументов вызвать другую функцию (тоже принимающую переменное число аргументов) и передать ей эти аргументы. Что-то такое:


А>>
А>>void foo( ... )
А>>{
А>>   bar( ... );
А>>}
А>>

D>средствами языка или можно использовать грязные хаки?

средствами языка
нужно из конструктора производного класса вызвать конструктор базового
параметры — форматная строка и переменные
Re[3]: Пробросить эллипсис дальше
От: Chorkov Россия  
Дата: 20.03.09 16:00
Оценка:
Здравствуйте, Аноним, Вы писали:


D>>средствами языка или можно использовать грязные хаки?

А>средствами языка
А>нужно из конструктора производного класса вызвать конструктор базового
А>параметры — форматная строка и переменные

Средствами языка это невозможно.
Re[5]: Пробросить эллипсис дальше
От: McQwerty Россия  
Дата: 21.03.09 12:34
Оценка:
Кстати, под 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

Re: Поздравляю, ты 15-й с этим вопросом
От: Roman Odaisky Украина  
Дата: 21.03.09 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как "пробросить" эллипсис дальше?


http://wiki.rsdn.ru/ellipsis.ashx
До последнего не верил в пирамиду Лебедева.
Re[2]: Поздравляю, ты 15-й с этим вопросом
От: Аноним  
Дата: 21.03.09 14:11
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Поздравляю, ты 15-й с этим вопросом


Где я могу получить свой приз? )
Re[2]: Поздравляю, ты 15-й с этим вопросом
От: opener  
Дата: 23.03.09 08:46
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Аноним, Вы писали:


А>>Как "пробросить" эллипсис дальше?


RO>http://wiki.rsdn.ru/ellipsis.ashx


Ну, здорово. А как это ипользовать для конструктора с эллипсисом?
Re[3]: Поздравляю, ты 15-й с этим вопросом
От: Centaur Россия  
Дата: 25.03.09 11:55
Оценка:
Здравствуйте, opener, Вы писали:

А>>>Как "пробросить" эллипсис дальше?


RO>>http://wiki.rsdn.ru/ellipsis.ashx


O>Ну, здорово. А как это ипользовать для конструктора с эллипсисом?


Настоятельно попросить автора класса с конструктором с многоточием приделать этому классу также и конструктор с varargs’ами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.