Добрый день,
Захотелось мне написать такую функцию
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, Вы писали:
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);
}
Ну собственно вот.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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, Вы писали:
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.