std::stringstream to std::string

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 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...

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.

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.