Site Tools


template
  #include <QApplication>
  #include <iostream>
  #include <string>
  using namespace std;
  
  
  template<class T>
  const T& maxi(const T &a, const T &b){
      return a > b ? a : b;
  }
  
  template<class T, int intVar>
  struct TestClass{
  public:
      T testValue;
      T array[intVar];
  };
  
  int main(int argc, char *argv[])
  {
      QApplication a(argc, argv);
  
      cout << maxi(10, 11) << endl;
      cout << maxi(0.44, 0.23) << endl;
      cout << maxi('d', 'e') << endl;
  
      TestClass<int, 10> testObj = { 2, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      testObj.testValue = 10;
  
     return 1;
  }

вывод

11
0.44
e

Template со значением по умолчанию

  template<class T, class conteiner = vector<T> > // значение по умолчанию
  class MyClass{
  public:
      MyClass(T inVal){
          classConteiner.push_back(inVal);
      }
      conteiner classConteiner;
  };
  
  int main(int argc, char *argv[])
  {
      cout << "Test" << endl;
      MyClass<int> testObj(29); // используется значение по умолчанию
      int outputTmpInt = testObj.classConteiner.back();
      cout << outputTmpInt << endl;
      return 1;
  }

Template определяющий тип с использвоанием typename 0_0

  template<class T>
  class MyClass{
  public:
      MyClass(int inVal){
          value = inVal;
      }
      typename T::myType value; // Тут надо использовать typename, иначе компиляция не пройдет.
  };
  
  class AnotherClass{
  public:
      typedef int myType;
  };
  
  int main(int argc, char *argv[])
  {
      MyClass<AnotherClass> testObj(11);;
      cout << testObj.value << endl;
  }

Вложенные в друг друга template + template внутри класса для функции

  template<class T>
  class MyClass{
  public:
      MyClass(T inVal){
          value = inVal;
      }
      template<class X>
      void assign(X &x){
          value = x.value;
      }
      T value;
  };
  
  
  int main(int argc, char *argv[])
  {
      MyClass<int> testObj(11);
      MyClass<double> testObj2(13);
  
      testObj.assign(testObj2);
  
      cout << testObj.value << endl;
  }

специализация шаблонов

template<> - пустота меж триугольных скобок + ниже указано class MyClass<int>. Все это создает отдельную реализацию для шаблона именно с int или другим типом.

TODO: править, добавить пример http://habrahabr.ru/post/54762/

You could leave a comment if you were logged in.
template.txt · Last modified: 2013/04/10 01:05 by konovalov

Page Tools