30 Aralık 2015 Çarşamba

std::tuple_cat

Giriş
Şu satırı dahil ederiz
#include <tuple>
Bir veya daha fazla tuple'ı birleştirerek yeni bir tuple oluşturur. Genelde std::make_tuple ile kullanılır. 

Örnek
Çok basitleştirilimiş bu örnekte önce bir pair yaratılıyor. pair make_tuple() ile tuple haline getiriyor ve diğer tuple nesneleri ile birleştiriliyor.
return std::tuple_cat(std::make_tuple(std::make_pair(...,...)),...);
Örnek
Şöyle yaparız. Bu örnek çok daha karışık.  std::make_index_sequence ile n tane tekrar eden elemanlı yapı yaratılıyor ve bu bir tuple'a çevriliyor. Daha sonra tüm tuple nesneleri std::tuple_cat ile birleştirilip yeni bir tuple yaratılıyor.
template <typename T,size_t reps>
struct repeated_type {
    using type = T;
    static const size_t N = reps;
};

template <typename T,std::size_t...n>
auto n_tuple_impl(std::index_sequence<n...>){ 
    return std::make_tuple( (n,T{})...); 
}

template <typename repT>
using n_tuple_single = decltype( n_tuple_impl<typename repT::type>(
std::make_index_sequence<repT::N>() )
);

template <typename...repT>
using n_tuple = decltype( std::tuple_cat( ( n_tuple_single<repT>() )... ) );

int main() {
    using two_ints = repeated_type<int,2>;
    using three_doubles = repeated_type<double,3>;
    using my_tuple = n_tuple<two_ints,three_doubles>;
    static_assert(std::is_same<std::tuple<int,int,double,double,double>,my_tuple>::value);
}

Hiç yorum yok:

Yorum Gönder