Gå til innhold

..[fannt løsning selv].. (typelist-stuff)


Anbefalte innlegg

GCC 3.4 (linux)

 

Edit:

Fannt løsning selv - og rettet opp koden under.

 

#include <iostream>

#define M_typelist1(T1) ::Oxymora::Typelist::Typelist<T1, ::Oxymora::NullT>
#define M_typelist2(T1, T2) ::Oxymora::Typelist::Typelist<T1, M_typelist1(T2) >
#define M_typelist3(T1, T2, T3) ::Oxymora::Typelist::Typelist<T1, M_typelist2(T2, T3) >

using namespace std;


namespace Oxymora {

/// Null type.
class NullT {};


namespace Typelist {

 /// Typelist.
 template<typename T, typename U>
 struct Typelist {
 	typedef T HEAD;
 	typedef U TAIL;
 }; // struct Typelist
 
 
 /// typeAt
 /** Return type at INDEX in TLIST as inner type result. */
 template<class TLIST, unsigned int INDEX> 
 struct typeAt;

 template<typename HEAD, class TAIL>
 struct typeAt<Typelist<HEAD, TAIL>, 0> {
 	typedef HEAD result;
 }; // struct typeAt
 
 template<typename HEAD, class TAIL, unsigned int I>
 struct typeAt<Typelist<HEAD, TAIL>, I> {
 	typedef typename typeAt<TAIL, I - 1>::result result;
 }; // struct typeAt
 
 
 /// replace
 /** Replace T with U in TLIST, result is inner type result. */
 template<class TLIST, typename T, typename U> 
 struct replace;
 
 template<typename T, typename U>
 struct replace<NullT, T, U> {
 	typedef NullT result;
 }; // struct replace
 
 template<typename T, class TAIL, typename U>
 struct replace<Typelist<T, TAIL>, T, U> {
 	typedef Typelist<U, TAIL> result;
 }; // struct replace
 
 template<typename HEAD, class TAIL, typename T, typename U>
 struct replace<Typelist<HEAD, TAIL>, T, U> {
 	typedef Typelist<HEAD, typename replace<TAIL, T, U>::result> result;
 }; // struct replace

}; // namespace Typelist
 
}; // namespace Oxymora


int main()
{
typedef M_typelist3(char, double, int) T1;

// Should replace int in T1 with char const* .. right?
typedef Oxymora::Typelist::replace<T1, int, char const*>::result T2;

Oxymora::Typelist::typeAt<T2, 2>::result cstr = "blah"; /* test.cpp:72: error: invalid conversion from `const char*' to `int' */
cout << cstr << endl;

return(0);
} // main()

 

Trøtt i trynet og ser ikke feilen - noen som ser noe?

 

Her er en versjon i farger:

http://nostdal.net/paste/b932305ba685d5041...6ce2d88c2a.html

 

(feilmeldnig er pastet som kommentar i koden)

Endret av søppel
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...