reference и переменное число аргументов
От: Alex Fedotov США  
Дата: 01.12.05 22:19
Оценка:
Добрый день,

Захотелось мне написать такую функцию

std::wstring sprintf(
    const std::wstring& format,
    ...
    )
{
    va_list va;
    va_start(va, format);

    ...
}


В таком виде не работает, потому что va_start внутри пытается взять адрес и размер от format, с соответствующими результатами. Хотелось бы это как-нибудь обойти, чтобы пользователи могли передавать в функцию объект wstring напрямую (а не вызывать .c_str() каждый раз).

Сама функция не обязана принимать const std::wstring&, этот параметр можно заменить на какой-нибудь адаптер, если это поможет.
-- Alex Fedotov
Re: такой адаптер поможет?
От: Erop Россия  
Дата: 01.12.05 22:29
Оценка: 26 (1)
Здравствуйте, Alex Fedotov, Вы писали:

AF>Сама функция не обязана принимать const std::wstring&, этот параметр можно заменить на какой-нибудь адаптер, если это поможет.



template<typename T>
class fake_reference {
public:
    fake_reference( T& t ) : ref( t ) {}
    operator T&() const { return ref; }

private:
    T& ref;
};

std::wstring sprintf(
    fake_reference<const std::wstring> format,
    ...
    )
{
    va_list va;
    va_start(va, format);
}


Ну собственно вот.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: reference и переменное число аргументов
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.12.05 23:04
Оценка: 1 (1)
Здравствуйте, Alex Fedotov, Вы писали:

http://www.rsdn.ru/Forum/Message.aspx?mid=589260
Автор: adontz
Дата: 31.03.04
?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: такой адаптер поможет?
От: Alex Fedotov США  
Дата: 01.12.05 23:31
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Alex Fedotov, Вы писали:


AF>>Сама функция не обязана принимать const std::wstring&, этот параметр можно заменить на какой-нибудь адаптер, если это поможет.



E>
E>template<typename T>
E>class fake_reference {
E>public:
E>    fake_reference( T& t ) : ref( t ) {}
E>    operator T&() const { return ref; }

E>private:
E>    T& ref;
E>};

E>std::wstring sprintf(
E>    fake_reference<const std::wstring> format,
E>    ...
E>    )
E>{
E>    va_list va;
E>    va_start(va, format);
E>}
E>


E>Ну собственно вот.


Наверно, подойдет. А при таком вызове

sprintf(std::wstring(), ...);

строка не будет уничтожаться раньше времени?
-- Alex Fedotov
Re[3]: такой адаптер поможет?
От: crable США  
Дата: 02.12.05 07:36
Оценка: 13 (1)
Здравствуйте, Alex Fedotov, Вы писали:

AF>Здравствуйте, Erop, Вы писали:


E>>Здравствуйте, Alex Fedotov, Вы писали:


AF>>>Сама функция не обязана принимать const std::wstring&, этот параметр можно заменить на какой-нибудь адаптер, если это поможет.



E>>
E>>template<typename T>
E>>class fake_reference {
E>>public:
E>>    fake_reference( T& t ) : ref( t ) {}
E>>    operator T&() const { return ref; }

E>>private:
E>>    T& ref;
E>>};

E>>std::wstring sprintf(
E>>    fake_reference<const std::wstring> format,
E>>    ...
E>>    )
E>>{
E>>    va_list va;
E>>    va_start(va, format);
E>>}
E>>


E>>Ну собственно вот.


AF>Наверно, подойдет. А при таком вызове


AF>sprintf(std::wstring(), ...);


AF>строка не будет уничтожаться раньше времени?


не будет.
Можно, например, здесь
Автор: a-lex
Дата: 03.11.05
посмотреть.
The last good thing written in C was Franz Schubert's Symphony No. 9.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.