24 Nisan 2018 Salı

Template Specialization - Member Function

Giriş
Template specialization belirli bir tip için algoritmanın farklı çalışmasını sağlamak için kullanılabilir. Ayrıca debug için de faydalıdır.

Tanımlama
Template kodları normalde .h dosyasında olmalı. Template Specialization kullanarak cpp dosyasında tanımlamak ta mümkün.

Tanımlama Sırası
Sıranın önemi yoktur. Şöyle olabilir
// specialization A
...
// specialization B
...
veya şöyle olabilir.
// specialization B
...
// specialization A
...

Örnek
.h dosyasında şöyle yaparız.
template <>
void TClass<int>::doSomething(std::vector<int> * v);
Daha sonra .cpp dosyasında metodları yazarız (implementation). Şöyle yaparız.
template <>
void TClass<int>::doSomething(std::vector<int> * v) {
 // Do somtehing with a vector of int's
}
Template Specialization - Tag
Farklı tag'ler için şöyle yaparız.
enum class Mode
{
   Slow,
   Fast,
   Default
};

template<Mode T = Mode::Default>
int foo() { ...}

template<> 
int foo<Mode::Fast>() { ...}
Nested Template Specialization
Şöyle yaparız.
template<typename T>
class A
{
public:
  void foo()
  {
    foo_impl<T,void>::exec();
  }

private:
  template<typename T, typename DUMMY>
  struct foo_impl
  {
    static void exec()
    {
      //Default impl
    }
  };

  template<typename DUMMY>
  struct foo_impl<int,DUMMY>
  {
    static void exec()
    {
      int i = 0; //Breakpoint here
    }
  }
};

Hiç yorum yok:

Yorum Gönder