11 Haziran 2020 Perşembe

std::enable_if_t Alias'ı

Giriş
C++14 ile geliyor. Aslında bir std::enable_if için bir alias'tır. Açıklaması şöyle.
The _t (and _v) aliases were introduced in c++14.

Anywhere you use enable_if::type you can use enable_if_t
Kullanım
std::enable_if<...>::type şeklinde uzun uzun yazmak yerine std::enable_if_t<...> şeklinde kullanırız.

Örnek
Şöyle kullanırız. Eğer predicate true ise void döner.
std::enable_if_t<...> 
Kod Etkinleştirmek (SFINAE) İçin - Predicate 
Şöyle yaparız.
template<typename T> 
std::enable_if_t<std::is_floating_point<T>::value> 
Func(const T *in, T *out)
{
    std::cout << "3\n";
}
Kodu Etkinleştirmek (SFINAE) ve Dönüş Tipi İçin - Predicate + Return Type
Şöyle yaparız.
//deference
auto operator*() -> std::enable_if_t<!std::is_array<T>::value, T&>
{
  return *mPtr;
}

//arrow  access operator
auto operator->() -> std::enable_if_t<!std::is_array<T>::value, T*>
{   
  return mPtr;
}

auto operator[](std::size_t idx) -> std::enable_if_t<std::is_array<T>::value, T&>
{   
  return mPtr[idx];
}
Diğer
std::enable_if ile problemi görmek zor oluyorsa static_assert kullanılabilir. Şöyle yaparız.
template <class T>
void foo(const T f) {
    static_assert(std::is_same<std::string, T>::value
                  || std::is_same<const char*, T>::value, "Incorrect type");
    /*do stuff with f*/
}


Hiç yorum yok:

Yorum Gönder