28 Eylül 2020 Pazartesi

std::min metodu

Giriş 
Metodun imzası şöyle
const T& min (const T& l, const T& r );
Açıklaması şöyle
std::min is defined in terms of an (a<b) comparison expression (cppreference), with (a<b) ? a : b as a possible implementationstinationPrefixes
Bu metodun const olmayan bir türevi yok!
template <typename T>
T& min(T& a, T& b);
Bu yüzden şu kod derlenmez.
std::min(x, y) += 1;
Gerçekleştirimi şöyle olabilir.
const T& min(const T& l, const T&r) {
  return l <= r ? l : r;
}
Şöyle olabilir.
const T& min(const T& l, const T& r) {
  return r < l ? r : l;
}
Örnek
T tipini belirtmek istersek şöyle yaparız. Belitmezsek, parametre tiplerinden çıkarım yapılır.
std::min<int>(fifoCount, 128);
Her iki parametrenin de aynı tip olması gerekir.

Örnek
volatile aynı const gibi bir qualifier'dır. Elimizde şöyle bir kod olsun.
volatile int i{100};
int j{200};
std::cout << std::min(i, j);
Parametre tipleri farklı olduğu için bu kod derlenmez çıktı olarak şunu alırız.
error: no matching function for call to ‘min(volatile int&, int&)’
Çünkü std::min her iki parametresinin de aynı tip olmasını ister. Şöyle yaparız.
std::min<volatile int>(i, j)
std::min - initializer_list
C++11 ile geliyor. İmzası şöyle
template <class T>
constexpr T min(initializer_list<T> t);
Karşılaştırma için T'nin < işlemini desteklemesi ve metod T döndürdüğü için T'nin CopyConstructable olması gerekir.
Requires: T is LessThanComparable and CopyConstructible and t.size() > 0.

Örnek - variadic template
T yapısının std::pair olduğunu varsayalım. Şöyle yaparız.
#include <algorithm>

template <typename ...Ts>
auto intersection(const Ts&... ps)
{
  return std::make_pair(std::max({ps.first...}), std::min({ps.second...}));
}

Hiç yorum yok:

Yorum Gönder