Template di MC++

Ini bukan Generics di .Net Framework 2.0 loh... template sudah ada di MC++ sejak .Net Fr 1.0. Namun template di Managed C++ tidak bisa diatributkan ke atas managed class (__gc class) , hanya bisa diatributkan ke global function.

 

Contoh:

#using <mscorlib.dll>

using namespace System;

 

template<typename T1, typename T2>

inline T1 max(T1 t1, T2 t2) {

      if ( t1 > t2 ) return t1;

      return t2;

}

 

__value class KlasBiasa {

public:

      KlasBiasa(int i, String *s) : m_Int(i), m_Str(s) {}

      __property int get_Int() { return m_Int; }

      __property String * get_Str() { return m_Str; }

 

      static bool op_GreaterThan(KlasBiasa kiri, KlasBiasa kanan) {

            if (kiri.m_Int > kanan.m_Int)

                  return true;

            return false;

      }

 

private:

      int m_Int;

      String *m_Str;

};

 

int main() {

      int imax = max(1,10);

      Console::Write(S"max(1,10) = ");

      Console::WriteLine(imax);

 

      KlasBiasa b1(10, S"b1");

      KlasBiasa b2(100, S"b2");

      KlasBiasa bmax = max(b1,b2);

      Console::Write(S"max(b1,b2) = ");

      Console::WriteLine(bmax.Str);

}

 

Berikut outputnya:

max(1,10)  = 10

max(b1,b2) = b2

 

Fungsi max bukan sebuah native function loh… MC++ compiler otomatis membuat fungsi dengan parameter berbeda:

.method public static valuetype KlasBiasa

'max'

(valuetype KlasBiasa t1,valuetype KlasBiasa t2) cil managed

 

.method public static int32

        'max'(int32 t1,int32 t2) cil managed

 

Bagaimana dengan fungsi yang mempunyai argumen managed class? Rada susah, karena variabel managed class harus menggunakan pointer, so op_GreaterThan() nya musti ada pointer di parameter nya:

 

__gc class KlasString {

public:

      KlasString(String *s) : m_Str(s) {}

      __property String * get_Str() { return m_Str; }

 

      static bool op_GreaterThan(KlasString *kiri, KlasString *kanan) {

            int i = String::Compare(kiri->m_Str, kanan->m_Str);

            if (i > 0) return true;

            return false;

      }

 

private:

      String *m_Str;

};

 

Karena parameter op_GreaterThan() nya pointer, kita gak bisa manggil dengan cara:

(anggap s1 & s2 bertipe KlasString)

s1 > s2    (Error! Pointer cuman bisa dibandingkan dengan == )

*s1 > *s2    (Error juga! Lihat deklarasi parameter op_GreaterThan)

 

So bagaimana membuat template max untuk managed class? Kita mesti memanggil op_GreaterThan secara manual! Hey, gak masalah, toh compiler juga sebenarnya melakukan ini secara explicit untuk setiap overloaded operator:

 

template<typename T1, typename T2>

inline T1 * maxObj(T1 *t1, T2 *t2) {

      if ( T1::op_GreaterThan(t1,t2) ) return t1;

      return t2;

}

 

Dan tambahkan ini ke dalam main:

      KlasString *s1 = new KlasString(S"hello");

      KlasString *s2 = new KlasString(S"world");

      KlasString *smax = maxObj(s1,s2);

      Console::Write(S"max(hello,world) = ");

      Console::WriteLine(smax->Str);

 

Outputnya:

max(hello,world) = world

 

Share this post: | | | |
Published Tuesday, March 29, 2005 3:58 AM by zeddy
Filed under:

Comments

# re: Template di MC++

Friday, April 29, 2005 6:24 PM by zeddy
adad
Powered by Community Server (Commercial Edition), by Telligent Systems