contoh template c++ terbaru

untuk kamu yang suka akan pemrograman, nih saya punya sedikit artikel tentang template C++ yang bissa kamu edit , dan juga bisa kamu jalanin


Fungsi template adalah fungsi khusus yang dapat beroperasi dengan jenis generik. Hal ini memungkinkan kita untuk membuat fungsi template yang fungsi dapat disesuaikan dengan lebih dari satu jenis atau kelas tanpa mengulangi seluruh kode untuk setiap jenis.

Dalam C + + ini dapat dicapai dengan menggunakan parameter template. Sebuah parameter template adalah jenis khusus dari parameter yang dapat digunakan untuk melewati sebuah tipe sebagai argumen: seperti parameter fungsi biasa dapat digunakan untuk melewatkan nilai ke fungsi, parameter template memungkinkan untuk lulus juga jenis ke fungsi. Fungsi Template ini dapat menggunakan parameter ini seolah-olah mereka jenis biasa lainnya.

Format untuk menyatakan fungsi template dengan jenis parameter adalah:

template <class identifier> function_declaration;
template <typename identifier> function_declaration;

Satu-satunya perbedaan antara kedua prototip adalah penggunaan baik kelas kata kunci atau keyword typename. Penggunaannya tidak jelas, karena kedua ungkapan memiliki arti yang sama persis dan berperilaku dengan cara yang sama.

Misalnya, untuk membuat fungsi template yang mengembalikan salah satu yang lebih besar dari dua benda yang bisa kita gunakan:



1
2
3
4
template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}


Di sini kita telah menciptakan sebuah fungsi template dengan myType sebagai parameter template nya. Parameter template ini merupakan jenis yang belum ditentukan, tetapi yang dapat digunakan dalam fungsi template seolah-olah jenis biasa. Seperti yang Anda lihat, fungsi template GetMax mengembalikan lebih dari dua parameter jenis ini masih terdefinisi.

Untuk menggunakan fungsi template ini kita menggunakan format berikut untuk panggilan fungsi:

function_name <type> (parameters);

Misalnya, untuk memanggil GetMax untuk membandingkan dua nilai integer bertipe int kita bisa menulis:


1
2
int x,y;
GetMax <int> (x,y);


Ketika compiler pertemuan panggilan ini ke fungsi template, menggunakan template untuk secara otomatis menghasilkan fungsi menggantikan setiap penampilan myType oleh jenis dioper sebagai parameter template yang aktual (int dalam kasus ini) dan kemudian panggilan itu. Proses ini dilakukan secara otomatis oleh compiler dan tidak terlihat oleh programmer.

Berikut adalah seluruh contoh:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// function template
#include <iostream>
using namespace std;

template <class T>
T GetMax (T a, T b) {
  T result;
  result = (a>b)? a : b;
  return (result);
}

int main () {
  int i=5, j=6, k;
  long l=10, m=5, n;
  k=GetMax<int>(i,j);
  n=GetMax<long>(l,m);
  cout << k << endl;
  cout << n << endl;
  return 0;
}
6
10


Dalam kasus ini, kami telah menggunakan T sebagai nama parameter template bukan myType karena lebih singkat dan pada kenyataannya adalah nama parameter template yang sangat umum. Tapi Anda dapat menggunakan identifier yang Anda suka.

Dalam contoh di atas kita menggunakan fungsi template GetMax () dua kali. Pertama kali dengan argumen bertipe int dan yang kedua dengan argumen tipe lama. Compiler telah dipakai dan kemudian disebut setiap kali versi yang sesuai fungsi.

Seperti yang Anda lihat, jenis T digunakan dalam GetMax () fungsi template bahkan untuk menyatakan objek baru dari tipe tersebut:



 
T result;




 Therefore, result will be an object of the same type as the parameters a and b when the function template is instantiated with a specific type.

In this specific case where the generic type T is used as a parameter for GetMax the compiler can find out automatically which data type has to instantiate without having to explicitly specify it within angle brackets (like we have done before specifying <int> and <long>). So we could have written instead:

1
2
int i,j;
GetMax (i,j);


Since both i and j are of type int, and the compiler can automatically find out that the template parameter can only be int. This implicit method produces exactly the same result:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// function template II
#include <iostream>
using namespace std;

template <class T>
T GetMax (T a, T b) {
  return (a>b?a:b);
}

int main () {
  int i=5, j=6, k;
  long l=10, m=5, n;
  k=GetMax(i,j);
  n=GetMax(l,m);
  cout << k << endl;
  cout << n << endl;
  return 0;
}
6
10


Notice how in this case, we called our function template GetMax() without explicitly specifying the type between angle-brackets <>. The compiler automatically determines what type is needed on each call.

Because our template function includes only one template parameter (class T) and the function template itself accepts two parameters, both of this T type, we cannot call our function template with two objects of different types as arguments:

1
2
3
int i;
long l;
k = GetMax (i,l); 


This would not be correct, since our GetMax function template expects two arguments of the same type, and in this call to it we use objects of two different types.

We can also define function templates that accept more than one type parameter, simply by specifying more template parameters between the angle brackets. For example:

1
2
3
4
template <class T, class U>
T GetMin (T a, U b) {
  return (a<b?a:b);
}


In this case, our function template GetMin() accepts two parameters of different types and returns an object of the same type as the first parameter (T) that is passed. For example, after that declaration we could call GetMin()with:

1
2
3
int i,j;
long l;
i = GetMin<int,long> (j,l);


or simply:

 
i = GetMin (j,l);


even though j and l have different types, since the compiler can determine the appropriate instantiation anyway.

Class templates

We also have the possibility to write class templates, so that a class can have members that use template parameters as types. For example: 

1
2
3
4
5
6
7
8
9
template <class T>
class mypair {
    T values [2];
  public:
    mypair (T first, T second)
    {
      values[0]=first; values[1]=second;
    }
};


The class that we have just defined serves to store two elements of any valid type. For example, if we wanted to declare an object of this class to store two integer values of type int with the values 115 and 36 we would write:

 
mypair<int> myobject (115, 36); 


this same class would also be used to create an object to store any other type:

 
mypair<double> myfloats (3.0, 2.18); 


The only member function in the previous class template has been defined inline within the class declaration itself. In case that we define a function member outside the declaration of the class template, we must always precede that definition with the template <...> prefix:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// class templates
#include <iostream>
using namespace std;

template <class T>
class mypair {
    T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    T getmax ();
};

template <class T>
T mypair<T>::getmax ()
{
  T retval;
  retval = a>b? a : b;
  return retval;
}

int main () {
  mypair <int> myobject (100, 75);
  cout << myobject.getmax();
  return 0;
}
100


Notice the syntax of the definition of member function getmax:

1
2
template <class T>
T mypair<T>::getmax () 


Confused by so many T's? There are three T's in this declaration: The first one is the template parameter. The second T refers to the type returned by the function. And the third T (the one between angle brackets) is also a requirement: It specifies that this function's template parameter is also the class template parameter.

Template specialization

If we want to define a different implementation for a template when a specific type is passed as template parameter, we can declare a specialization of that template.

For example, let's suppose that we have a very simple class called mycontainer that can store one element of any type and that it has just one member function called increase, which increases its value. But we find that when it stores an element of type char it would be more convenient to have a completely different implementation with a function member uppercase, so we decide to declare a class template specialization for that type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// template specialization
#include <iostream>
using namespace std;

// class template:
template <class T>
class mycontainer {
    T element;
  public:
    mycontainer (T arg) {element=arg;}
    T increase () {return ++element;}
};

// class template specialization:
template <>
class mycontainer <char> {
    char element;
  public:
    mycontainer (char arg) {element=arg;}
    char uppercase ()
    {
      if ((element>='a')&&(element<='z'))
      element+='A'-'a';
      return element;
    }
};

int main () {
  mycontainer<int> myint (7);
  mycontainer<char> mychar ('j');
  cout << myint.increase() << endl;
  cout << mychar.uppercase() << endl;
  return 0;
}
8
J


This is the syntax used in the class template specialization:

 
template <> class mycontainer <char> { ... };


First of all, notice that we precede the class template name with an empty template<> parameter list. This is to explicitly declare it as a template specialization.

But more important than this prefix, is the <char> specialization parameter after the class template name. This specialization parameter itself identifies the type for which we are going to declare a template class specialization (char). Notice the differences between the generic class template and the specialization:

1
2
template <class T> class mycontainer { ... };
template <> class mycontainer <char> { ... };


The first line is the generic template, and the second one is the specialization.

When we declare specializations for a template class, we must also define all its members, even those exactly equal to the generic template class, because there is no "inheritance" of members from the generic template to the specialization.

Non-type parameters for templates

Besides the template arguments that are preceded by the class or typename keywords , which represent types, templates can also have regular typed parameters, similar to those found in functions. As an example, have a look at this class template that is used to contain sequences of elements:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// sequence template
#include <iostream>
using namespace std;

template <class T, int N>
class mysequence {
    T memblock [N];
  public:
    void setmember (int x, T value);
    T getmember (int x);
};

template <class T, int N>
void mysequence<T,N>::setmember (int x, T value) {
  memblock[x]=value;
}

template <class T, int N>
T mysequence<T,N>::getmember (int x) {
  return memblock[x];
}

int main () {
  mysequence <int,5> myints;
  mysequence <double,5> myfloats;
  myints.setmember (0,100);
  myfloats.setmember (3,3.1416);
  cout << myints.getmember(0) << '\n';
  cout << myfloats.getmember(3) << '\n';
  return 0;
}
100
3.1416 


It is also possible to set default values or types for class template parameters. For example, if the previous class template definition had been:

 
template <class T=char, int N=10> class mysequence {..};


We could create objects using the default template parameters by declaring:

 
mysequence<> myseq;


Which would be equivalent to:

 
mysequence<char,10> myseq;


Template dan proyek multi-berkas
Dari sudut pandang compiler, template tidak fungsi normal atau kelas. Mereka disusun pada permintaan, yang berarti bahwa kode fungsi template tidak dikompilasi sampai Instansiasi dengan argumen template tertentu diperlukan. Pada saat itu, ketika Instansiasi diperlukan, compiler menghasilkan fungsi khusus untuk mereka argumen dari template.

Ketika proyek tumbuh itu adalah biasa untuk membagi kode program dalam file kode sumber yang berbeda. Dalam kasus ini, interface dan implementasi umumnya dipisahkan. Mengambil perpustakaan berfungsi sebagai contoh, antarmuka umumnya terdiri dari deklarasi prototipe dari semua fungsi yang bisa disebut. Biasanya ini dinyatakan dalam "file header" dengan ekstensi h., Dan pelaksanaan (definisi fungsi-fungsi) adalah dalam file mandiri dengan kode c.

Karena template yang dikompilasi bila diperlukan, ini memaksa pembatasan untuk proyek-proyek multi-file: pelaksanaan (definisi) dari template kelas atau fungsi harus dalam file yang sama seperti deklarasi. Itu berarti bahwa kita tidak dapat memisahkan antarmuka dalam file header yang terpisah, dan bahwa kita harus mencakup baik interface dan implementasi dalam file yang menggunakan template.

Karena tidak ada kode yang dihasilkan sampai template adalah instantiated bila diperlukan, kompiler siap untuk memungkinkan masuknya lebih dari sekali dari file template yang sama dengan kedua deklarasi dan definisi dalam suatu proyek tanpa menghasilkan kesalahan linkage.

contoh template c++ terbaru Rating: 4.5 Diposkan Oleh: AGUS TRI PURNOMO

0 komentar:

Post a Comment