2 Ocak 2017 Pazartesi

std::enable_if

Giriş
C++11 ile geliyor. Şöyle kullanırız. std::enable_if_t ile kardeştir.
typename std::enable_if<...>::type 
Kodu Etkinleştirmek İçin - Predicate
Şöyle yaparız.
template<typename T>
  typename std::enable_if<std::is_same<T, float>::value ||
                          std::is_same<T, double>::value >::type 
Function(const T*in, T*out)
{
    Func3(in, out);
}
Şöyle yaparız.
template <typename T,
  typename std::enable_if <std::is_same<T, int         >::value ||
                           std::is_same<T, float       >::value ||
                           std::is_same<T, const char *>::value>::type* = nullptr>
void test(T i)
{
   //process data
}
Type
Örnek
Şöyle yaparız.
template<typename T> struct identity { using type = T; };

template<std::size_t N>
using bit_type = typename
    std::conditional_t<N == std::size_t{  8 }, identity<std::uint8_t>,
    std::conditional_t<N == std::size_t{ 16 }, identity<std::uint16_t>,
    std::conditional_t<N == std::size_t{ 32 }, identity<std::uint32_t>, 
    std::enable_if<N == std::size_t{ 64 }, std::uint64_t>>>>::type;
Kullanmak için şöyle yaparız. Eğer 64'ten farklı bir sayı verirsek std::enable_if<false, uint64_t> elde ederiz ve bu da derlenmez.
bit_type<8u> a;  // == std::uint8_t
bit_type<16u> b; // == std::uint16_t
bit_type<32u> c; // == std::uint32_t
bit_type<64u> d; // == std::uint64_t

Hiç yorum yok:

Yorum Gönder