Переменный список аргументов без именованного аргумента? - PullRequest
1 голос
/ 29 апреля 2010

Возможно ли иметь функцию с переменными аргументами и без именованного аргумента?

Например:

SomeLogClass("Log Message Here %d").Log(5);
SomeLogClass("Log Message Here %d").Error(5);

Ответы [ 4 ]

2 голосов
/ 29 апреля 2010

Взгляните на методы аргумента QString . Похоже, это то, что вы ищете.

Вы можете определенно свернуть свои собственные, хотя реализация может оказаться не совсем тривиальной, особенно если вы хотите, чтобы она поддерживала спецификаторы формата printf. Если стиль printf не нужен, цепочка вызовов типа replace_all кажется выполнимой.

1 голос
/ 29 апреля 2010

Откуда я, мы используем это:

Log << "LogMessageHere: " << ErrorClass << 5 << whatever << std::endl;

Это не совсем ответ на ваш вопрос, но это решение вашей проблемы, и я думаю, что это больше похоже на c ++.

1 голос
/ 29 апреля 2010

Вы можете написать код, подобный приведенному выше - да, вы можете. Но вы не можете переносить запись функции с переменными параметрами, по крайней мере, без одного параметра без переменных. Например, в printf () это строка формата. Другими словами, вы можете написать функцию s как:

int printf( const char * format, ... );

но не:

int printf( ... );
0 голосов
/ 10 мая 2011

Правильный ответ - нет, вы не можете определить только переменные аргументы, потому что механизм в C / C ++ для этого использует фиксированный аргумент для вычисления адреса, например:

void f(int a, ...) {
    va_list args;
    va_start(args, a); // without a, this macro DOESN'T WORK!!!


}

Ответ, который вы пометили, обходит его, по умолчанию аргументы. Но чему это должно научить новичков, так это то, что дефолт аргументов не означает, что аргументы не переданы, это означает, что вам не нужно их вводить.

void f (int a = 0, ...)

Поэтому, когда вы звоните f, вы можете написать:

f();

но внутри он пишет f (0)

...