Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zbun oko specijalizacije šablona

[es] :: C/C++ programiranje :: Zbun oko specijalizacije šablona

[ Pregleda: 1204 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Zbun oko specijalizacije šablona24.06.2011. u 10:45 - pre 155 meseci
Navešću uprošćeni primer koji ilustruje ono što ja hoću. Ovakav kod neće da se kompajlira:

Code:
#include <iostream>

using namespace std;

template<typename T, bool onScreen>
class Pi
{
public:

    static T lo()
    {
        return 3.1415926535897932383L;
    }

    static T up()
    {
        return 3.1415926535897932385L;
    }

    static T eps()
    {
        T result = up() - lo();

        if (onScreen) {
            cout << result << endl;
        }

        return result;
    }
};

template<bool onScreen>
float Pi<float, onScreen>::lo()
{
    return 3.1415925f;
}

template<bool onScreen>
float Pi<float, onScreen>::up()
{
    return 3.1415927f;
}

template<bool onScreen>
double Pi<double, onScreen>::lo()
{
    return 3.1415926535897931;
}

template<bool onScreen>
double Pi<double, onScreen>::up()
{
    return 3.1415926535897935;
}

int main()
{
    Pi<double, true>::eps();
    
    return 0;
}


Kako napisati pa da može? Evo šta se uspešno kompajlira:

Code:
#include <iostream>

using namespace std;

template<typename T, bool onScreen>
class Pi
{
public:

    static T lo()
    {
        return 3.1415926535897932383L;
    }

    static T up()
    {
        return 3.1415926535897932385L;
    }

    static T eps()
    {
        T result = up() - lo();

        if (onScreen) {
            cout << result << endl;
        }

        return result;
    }
};

template<>
float Pi<float, true>::lo()
{
    return 3.1415925f;
}

template<>
float Pi<float, false>::lo()
{
    return 3.1415925f;
}

template<>
float Pi<float, true>::up()
{
    return 3.1415927f;
}

template<>
float Pi<float, false>::up()
{
    return 3.1415927f;
}

template<>
double Pi<double, true>::lo()
{
    return 3.1415926535897931;
}

template<>
double Pi<double, false>::lo()
{
    return 3.1415926535897931;
}

template<>
double Pi<double, true>::up()
{
    return 3.1415926535897935;
}

template<>
double Pi<double, false>::up()
{
    return 3.1415926535897935;
}

int main()
{
    Pi<double, true>::eps();
    
    return 0;
}


E, sad, šta da drugi parametar nije bio tipa bool, nego npr. int? Ova doskočica ne bi prošla.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Zbun oko specijalizacije šablona24.06.2011. u 12:09 - pre 155 meseci
Preporučili su mi da deo koji ću da menjam izdvojim u zasebnu šablonsku klasu, koju ću celu da specijalizujem, a onda da je nasleđujem u svojoj šablonskoj klasi. Primer:

Code:
#include <iostream>

using namespace std;

template<typename T, bool doubling>
class PiBase
{
public:
    static T lower()
    {
        return 3.1415926535897932383L*(doubling ? 2 : 1);
    }

    static T upper()
    {
        return 3.1415926535897932385L*(doubling ? 2 : 1);
    }
};

template<bool doubling>
class PiBase<float, doubling>
{
public:
    static float lower()
    {
        return 3.1415925f*(doubling ? 2 : 1);
    }

    static float upper()
    {
        return 3.1415927f*(doubling ? 2 : 1);
    }
};

template<bool doubling>
class PiBase<double, doubling>
{
public:
    static double lower()
    {
        return 3.1415926535897931*(doubling ? 2 : 1);
    }

    static double upper()
    {
        return 3.1415926535897935*(doubling ? 2 : 1);
    }
};

template<typename T, bool doubling>
class Pi : public PiBase<T, doubling>
{
public:
    static T eps()
    {
        return upper() - lower();
    }
};

int main()
{
    cout << Pi<float, true>::eps() << endl;
    cout << Pi<double, true>::eps() << endl;
    cout << Pi<long double, true>::eps() << endl;

    return 0;
}


Ovo skoro radi. Zapravo, radi na VC++, dok GNU traži da se navede direktiva -fpermissive da bi se kompajliralo.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

1jedini
Dejan Milosavljevic
BG

Član broj: 102721
Poruke: 74
*.dynamic.sbb.rs.



Profil

icon Re: Zbun oko specijalizacije šablona28.06.2011. u 19:42 - pre 155 meseci
Ne mozes da specijalizujes funkciju clanicu ako ne postoji odgovarajuca (parcijalna)specijalizacija njene klase.
Svaka specijalizacija predstavlja drugi tip i nema veze sa primarnim templejtom ili drugom (parcijalnom)specijalizacijom.

Citat:
Nedeljko: Preporučili su mi da deo koji ću da menjam izdvojim u zasebnu šablonsku klasu, koju ću celu da specijalizujem, a onda da je nasleđujem u svojoj šablonskoj klasi.


Da nasledjujes mozes a ne moras, zavisi od situacije.
Ovde mozda i nisi trebao.

Nisam bacio pogled na ovaj nov standard al mislim da su nesto dodali po tom pitanju, mozda kaci i ovo sto ti je potrebno.


AKA DDMM
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Zbun oko specijalizacije šablona29.06.2011. u 10:33 - pre 155 meseci
Ovo radi besprekorno bez obzira na standard:

Code:
#include <iostream>

using namespace std;

template<typename T, bool doubling>
class PiBase
{
public:
    static T lower()
    {
        return 3.1415926535897932383L*(doubling ? 2 : 1);
    }

    static T upper()
    {
        return 3.1415926535897932385L*(doubling ? 2 : 1);
    }
};

template<bool doubling>
class PiBase<float, doubling>
{
public:
    static float lower()
    {
        return 3.1415925f*(doubling ? 2 : 1);
    }

    static float upper()
    {
        return 3.1415927f*(doubling ? 2 : 1);
    }
};

template<bool doubling>
class PiBase<double, doubling>
{
public:
    static double lower()
    {
        return 3.1415926535897931*(doubling ? 2 : 1);
    }

    static double upper()
    {
        return 3.1415926535897935*(doubling ? 2 : 1);
    }
};

template<typename T, bool doubling>
class Pi : public PiBase<T, doubling>
{
public:
    static T eps()
    {
        return PiBase<T, doubling>::upper() - PiBase<T, doubling>::lower();
    }
};

int main()
{
    cout << Pi<float, true>::eps() << endl;
    cout << Pi<double, true>::eps() << endl;
    cout << Pi<long double, true>::eps() << endl;

    return 0;
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zbun oko specijalizacije šablona

[ Pregleda: 1204 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.