Hogyan tudok C++ olyan WriteLine parancsot csinálni, hogy az alábbi módon működjön?
int i = 10;
string s = "értéke"
WriteLine("Az i %1 jelenleg %2", s, i); //kimenet: Az i értéke jelenleg 10
Ami még lényeges lenne ha rosszul van sorszámozva (%1 ... %3) akkor hibát dobjon. Ha kevesebb érték van átadva neki mint amennyi kellene akkor is.
printf nem jó? [link]
Vagy ha gyakorlásképp te akarod megírni, akkor én mondjuk úgy indulnék neki, hogy % jelenként felvágnám (split/explode) a szöveget. Az 1. darabot betenném egy új szövegbe, majd a 2. darabtól kezdve megnézném, mi az első karakter. Itt ellenőrizni tudom a számot, hogy megfelelő-e. Ha megfelelő, akkor hozzáfűzöm a megfelelő változót az új szöveghez, majd az aktuális darabot is, az első karaktere nélkül. És így tovább, végig a darabokon. Végül kiírnám az új szöveget.
Hogy a változó számú paramétert hogy lehet C++-ban megcsinálni, azt rád, a guglira, vagy az alám kommentelő kollégára hagynám.
Ajánlom mindenki figyelmébe aki szerint nem lehetséges vagy elveszik a típusinformáció. Nem pontosan az amit a kérdező kérdez, de elég hasznos hozzá.
A probléma részét a hibaellenőrzés képzi, a kiíratással nincs probléma. Mivel rekurzívan írom ki, így azon a funkción belül nem tudom ellenőrizni. Legalábbis olyan módon, hogy az thread-safe legyen. A kiíratás az alábbi módon néz ki, ehhez kellene a hibaellenőrzés.
Jelenleg megpróbálkozok azzal, hogy ennek a tetejére építek egy funkciót ami ha hibát talál feldobja, ha nem akkor pedig meghívja az eredeti funkciót hadd csinálja a dolgát.
void WriteLine(const char* format)
{
std::cout << format << '\n';
}
template<typename T, typename... Args>
void WriteLine(const char* format, const T& value, Args&&... args)
{
for(; *format != '\0'; ++format)
{
if('%' == *format)
{
std::cout << value;
return WriteLine(++format, std::forward<Args>(args)...);
}
std::cout << *format;
}
}
int main(int argc, char *argv[])
{
std::locale::global(std::locale{"hu-HU"});
std::string s = "értéke";
int i = 10;
WriteLine("Az i % jelenleg %, duplája: %", s, i, i + i);
std::getchar();
return 0;
}
Sikerült megoldani az alábbi módszerrel.
"Jelenleg megpróbálkozok azzal, hogy ennek a tetejére építek egy funkciót ami ha hibát talál feldobja, ha nem akkor pedig meghívja az eredeti funkciót hadd csinálja a dolgát."
#2
Elsődleges szempont egy printf gyorsaságával egyenértékű, jobb printf volt a cél. Ez alatt azt értem, hogy nem kell megadni milyen adatot fog kapni, mert bármire működik aminek van << operátora.
Debug módban futás közben ellenőrzi a formátumot, ha pedig nincs ellenőrzés, a printf -el azonos sebességű.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!