[ Nedeljko @ 27.08.2008. 12:41 ] @
Imam šablonsku klasu, neka se zove A, koja ima argument koji je neki tip i koja treba da ima metodu koja vraća ime tog tipa kao string. Na primer:

Code:

#include <iostream>

using namespace std;

#define QUOTE(x) #x

template<typename T>
class A {
public:
    
    static void ispisiTip() { cout << QUOTE(T) << endl; }
};

int main() {
    A<int>::ispisiTip();

    return 0;
}


Problem je u tome što ovaj program ispisuje "T", a ne "int". Ukoliko umesto "QUOTE(T)" stavim "#T", dobijam grešku pri prevođenju. Sve je to logično, jer pre svih ostalih faza prevođenja pretprocesor mora u potpunosti da završi svoj deo posla. Šta da radim?
[ kiklop74 @ 27.08.2008. 12:56 ] @
Ne moze to tako. Nije to PHP :)

Za takve stvari moras da koristis RTTI. Na primer:



Code:

#include <typeinfo>

template<typename T>
class A {
public:
    
    static void ispisiTip() { std::cout << typeid(T).name() << std::endl; }
};

int main() {
    A<int>::ispisiTip();

    return 0;
}

[ Nedeljko @ 27.08.2008. 13:09 ] @
Upravo sam to isprobao, kad si me pretekao. Baš si brzi Gonzaves. Koristimo uglavnom g++ pod Linux-om i MinGW pod Windows-ima, ali i MS VC++. Stoga bih više voleo da rešenje bude prenosivo u smislu da za iste tipove dobijam iste stringove, ali dobro, što ne može ne može. Za to bih morao da napišem funkciju koja će da pretabači GNU odnosno MS stringove u neke naše.
[ kiklop74 @ 27.08.2008. 19:40 ] @
Savetujem ti da osmotris VCF (http://vcf-online.org) i rtti sistem koji je tamo implementiran.

Uvodni clanak je ovde

http://www.codeproject.com/KB/library/vcf_rtti.aspx
[ Goran Arandjelovic @ 29.08.2008. 23:01 ] @
@kiklop74
Hehe.. Nije to PHP... to je C++ :))) A evo i zašto...

@Nedeljko
Evo jednog portabilnog rešenja bez predprocesora i overhead-a u runtime-u zbog RTTI-a:

Code:

#include <iostream>
using namespace std;

template<typename U>
class IzaberiIme
{
    public:
        static const char *ime;
};

template<>
const char *IzaberiIme<int>::ime = "int";

template<>
const char *IzaberiIme<float>::ime = "float";

// itd...

template<typename T>
class A {
    public:
        static void ispisiTip() { std::cout << IzaberiIme<T>::ime << std::endl; }
};

int main()
{
    A<int>::ispisiTip();

    return 0;
}


bez potrebe za f-jom koja prevodi u tvoje stringove...

:)