[ Nedeljko @ 24.06.2011. 10:45 ] @
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.
[ Nedeljko @ 24.06.2011. 12:09 ] @
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.
[ 1jedini @ 28.06.2011. 19:42 ] @
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.

[ Nedeljko @ 29.06.2011. 10:33 ] @
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;
}