Fórumok
Sziasztok!
Egyszeru megoldast keresek a fenti problemara.
Termeszetesen a standart megoldast az ismerem:
std::stringstream ss;
ss <<1234 <<"abde" <<'s';
std::string str=ss.str();
Egy 1 sorost keresek akar boost-tal is.
Valami hasonlot:
std::string str=(str::stringstream() <<1234 <<"abde" <<'s').str();
Ez sajnos nem mukodik mert a zarjeles kifejezes std::ostream lesz.
Gabor
Hozzászólások
Miért kell egy sorosnak lennie? (Variadic template függvénnyel lehet egy sor...)
--
http://naszta.hu
Miért nem írsz rá egy functiont?
template<typename ...Args>
std::string concat_as_string(Args&& ...args) {
std::stringstream retval;
retval << std::forward<Args>(args)...;
return retval.str();
}
Es akkor mukodik (ha el nem csesztem valamit):
std::string str = concat_as_string(1234, "abde", 's');
Esetleg hasznalhatsz valamilyen formatting konyvtarat: tinyformat, fmtlib, boost::format
Egy macroba akarom minnel egyszerubben belepaszironzni. Logolashoz akarom hasznalni.
A problema formazasnal van:
#define LOG_INFO "[" << __PRETTY_FUNCTION__ << ":" <<__LINE__ << "]"
#define DEBUG(x) BOOST_LOG_TRIVIAL(debug) <<" DEBUG " << x << " " << LOG_INFO
DEBUG( "sdfsdf" << string1 << number1)
Szeretnem ha LOG_INFO mindig ugyanonnan kezdodjon mert zavaro ahogy ugral :
#define DEBUG(x) BOOST_LOG_TRIVIAL(debug) << " DEBUG " << std::setw(40) << x << LOG_INFO
Ez nem mukodik, mert a std::setw mindig csak a kovetkezo elemre vonatkozik.
Szeretnem a DEBUG osszes parameteret egybe rakni egy stringbe es ugy tovabb adni a setw-nek aztan pedig LOG_INFO jonne.
Sajnos nem vagyok egy nagy BOOST_LOG guru lehet, hogy ezt maskeppen is lehetne csinalni persze.
Felejtsd el a DEBUG makrot es hasznald ezt helyette:
template <typename ...Args>
void DEBUG(Args&& ...args) {
BOOST_LOG_TRIVIAL(debug) << "DEBUG " << std::setw(40) << concat_as_string(std::forward<Args>(args)...) << LOG_INFO;
}
Ez ugye hasznalja a fenti valaszomban hasznalt fuggvenyt is...
Jo otlet. Koszi.
Ha nincs egyszerubb akkor ez lesz.
Ilyesmit lehet csinálni ostream-hez is:
http://stackoverflow.com/questions/26782331/boost-pre-processor-accessi…
--
http://naszta.hu
Ez az amit kerestem.
Koszi!
Sikerült megtalálnom:
std::cout <<(dynamic_cast< std::ostringstream& >(std::ostringstream().flush() << "asdf, " << 123 << ", sdfsdfewr, " << true)).str();
A trükk a .flush()
Köszi az ötleteket.
Nekem – pusztán esztétikai alapon – a 3 soros megoldás jobban tetszik.
Elsőre érthető. Ez nem.
Fuszenecker Róbert
Ha jól értem a hozzászólásokból, a végcélok:
- fájlnév és sorszám hozzáadása a loghoz
- a log üzenet sajátos formázása
A Boost-log-ban attribute-okat adhatsz a log üzeneteidhez. A log "core" az attributumok alapján filterezi az üzeneteket, majd fájlba íráskor a log-üzenet struct -> string-é formázásakor is felhasználhatja az attr-okat. Vannak beépített attributumok, de tetszőleges user-defined-et is hozzá lehet adni a log-üzenethez.
Tehát, ha attributumként teszed bele pl a __FILE__-t, akkor tudsz rá filterezni, és az üzenet formázását is magad állíthatod be.
Boost-log fájlnév és sorszám logolása: http://stackoverflow.com/questions/22095667/how-to-log-line-number-of-c…
Boost log vegyesen: http://theboostcpplibraries.com/boost.log
Ha azonban a Boost flexibilitása nem kell, akkor vannak kisebb, egyszerűbb header-only C++ log rendszerek, amik alapból tudják ami neked kell (capture-öli a __LINE__-t és társait,stb). Github-on:
- easylogging++
- spdlog
- plog (példa custom formázásra: https://github.com/SergiusTheBest/plog/blob/master/samples/CustomFormat…)
Javaslom inkább ezeket, tömör és részletes leírás van hozzájuk.