31 Temmuz 2017 Pazartesi

Partial Template Specialziation

Giriş
Template için kullanılan bazı parametrelerin kod içinde belirlenmesi anlamına gelir. Template Specialization yazısına da göz atabilirsiniz.

Örnek - genişleme
Önce primary template yazılır. Şöyle yaparız.
template<typename T, int... N>
struct lookup_table_expand {
};
Sonra genişleyen kod yazılır. Şöyle yaparız. Burada kalıtım da kullanılıyor.
template<typename T, int L, int... N> 
struct lookup_table_expand<T, L, N...> :
  lookup_table_expand<T, L - 1, look_up_table_elem<T>(L - 1), N...> {
};
Daha sonra partial template specialization ile genişleme durdurulur. Genişleme L değeri 1 olunca durur. Şöyle yaparız.
template<typename T, int... N>
struct lookup_table_expand<T, 1, N...> {
  static constexpr std::array<T, sizeof...(N) + 1> values = {{
        look_up_table_elem<T>(0), N...
    }};
};
values değişkenine değer atamak için şöyle yaparız.
constexpr uint16_t look_up_table_elem(int i) {
    return ...;
}
Bu değişken static olduğu için bir tabloya doldurmak için şöyle yaparız.
const std::array<uint16_t, 2048> lookup_table =
  lookup_table_expand<uint16_t, 2048>::values;

Hiç yorum yok:

Yorum Gönder