Šablony podrobně I: přetěžování funkcí [24. 10.]

Slidy

Odkazy

Úloha na hodině

Mohlo by se vám hodit: std::stringstream.

Zadání:

fmt.h
#include <vector>
#include <set>
#include <string>
#include <sstream>
 
namespace str {
 
struct Printer {
 
    std::string str() const;
 
    /* funkce tvaru Printer &fmt(...) pro následující datové typy
     * - int     -- přímo vloží příslušné číslo
     * - long    -- totéž
     * - string  -- vloží daný string
     * - std::pair libovolných typů: vloží dojici tvaru (x, y)
     * - std::vector libovolných typů: vloží [ prvek, ... ]
     * - std::set libovolných typů: vloží { prvek, ... }
     *
     * vždy vrací referenci na this aby se dala volání řetězit:
     * dumper.fmt( 1 ).fmt( " " ).fmt( 2 ).fmt( std::vector< int >{ 1 } ).str()
     */
 
    /* funkce pro formátování kontejneru, jehož výpis začíná závorkou lbrace
     * a končí rbrace
     */
    template< typename C >
    Printer &fmtCont( const C &container, std::string lbrace, std::string rbrace );
 
    //...
};
 
template< typename T >
std::string fmt( const T &t ) {
    return Printer().fmt( t ).str();
}
}

Testovací main:

fmt.cpp
#include "fmt.h"
#include <iostream>
 
int main() {
    std::cout << str::fmt( 1 ) << std::endl;
    std::cout << str::fmt( "ahoj" ) << std::endl;
    std::cout << str::fmt( 1l << 48 ) << std::endl;
    std::cout << str::fmt( std::make_pair( 1, true ) ) << std::endl;
    std::cout << str::fmt( std::vector< int >{ 1, 2, 3 } ) << std::endl;
    std::cout << str::fmt( std::set< int >{ 1, 4, 2 } ) << std::endl;
    std::cout << str::fmt(
        std::vector< std::pair< std::set< int >, std::pair< int, int > > >{
            { { 1, 2, 3 }, { 1, 3 } },
            { { 0, 4, 1, 15 }, { 42, 0 } }
        } ) << std::endl;
}

Vzorový výstup:

result.txt
1
ahoj
281474976710656
(1, 1)
[ 1, 2, 3 ]
{ 1, 2, 4 }
[ ({ 1, 2, 3 }, (1, 3)), ({ 0, 1, 4, 15 }, (42, 0)) ]
QR Code
QR Code public:pb173:cviceni_10 (generated for current page)