2010-04-29 4 views
1

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

Например:

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

Ваши примеры не требуют VARIADIC объявления функций на всех. Возможно, вы могли бы показать нам декларации, которые вы хотите? –

ответ

2

Посмотрите на QString's arg методы. Кажется, это то, что вы ищете.

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

+0

Спасибо. Я не думал об этом так. –

+0

Мне это очень нравится, он ловко избегает проблемы! – Dov

1

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

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

но не:

int printf(...); 
1

Где я из мы используем это:

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

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

0

Правильный ответ: нет, вы не можете определить только переменные аргументы, поскольку механизм в 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(); 

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

Смежные вопросы