Cześć, potrzebuję własną klasę stringa. A skoro już ją robię, to chcę ją zaopatrzyć w metodę typu format. Ma to być format w stylu printf. Założenia są takie, że ma być optymalnie, zgodnie z zasadami i bez zewnętrznych bibliotek. Niestety Microsoft wyciął mi kilka możliwości, pisząc że różne metody (np. sprintf) są przestarzałe i nie powinno się ich używać. Odnoszą się jednak do StringCchVPrintfExW
Więc skonstruowałem sobie coś takiego, tylko chciałbym prosić, żebyście rzucili okiem i stwierdzili, czy jest ok, optymalnie i tak dalej, czy można lepiej:
String String::format(const wchar_t * str, ...)
{
va_list args;
va_start(args, str);
wchar_t * pBuff = NULL;
size_t remain;
size_t i = 0, len = 0;
do
{
if(pBuff)
{
delete [] pBuff;
pBuff = NULL;
}
len = MAX_PATH * ++i;
pBuff = new wchar_t[len + 1];
}while(StringCchVPrintfExW(pBuff, len, NULL, &remain, 0, str, args) != S_OK);
va_end(args);
String ret;
if(pBuff)
{
ret = pBuff;
delete [] pBuff;
}
return ret;
}
Działanie jest następujące:
W pętli tworzę sobie tablicę znaków o wielkości MAX_PATH.
Następnie wywołuję funkcję formatującą. Jeśli bufor okazał się za mały, to robię kolejną iterację: niszczę utworzoną wcześniej tablicę i tworzę nową - 2 razy większą. W końcu bufor jest odpowiednio duży, więc na jego podstawie tworzę stringa i go zwracam. Co o tym myślicie?