Giriş
C++14 ile geliyor. Aslında bir std::enable_if için bir alias'tır. Açıklaması şöyle.
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.
Şöyle yaparız.
Şöyle yaparız.
std::enable_if ile problemi görmek zor oluyorsa static_assert kullanılabilir. Şöyle yaparız.
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.Kullanım
Anywhere you use enable_if::type you can use enable_if_t
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ğerstd::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