Giriş
std::index_sequence ile kardeştir. std::integer_sequence yaratmak için std::make_index_sequence kullanılır
Kullanım Amacı
Elimizde şöyle bir kod olsun
Elmizde şöyle bir kod olsun.
Çağırmak için şöyle yaparız.
Elimizde generate_tuple diye bir kod olsun ve std::tuple nesnesini bizim için kolayca tanımlasın.
Yani şu kod true dönsün istiyoruz.
std::index_sequence ile kardeştir. std::integer_sequence yaratmak için std::make_index_sequence kullanılır
Kullanım Amacı
Elimizde şöyle bir kod olsun
template <size_t N>
class A {
template <size_t N>
someFunctions(){};
}
Bu kodu döngü içinde çağırmak isteyelim. Ancak bunu başaramayız çünkü template kodlarun derleme zamanında belirli sabitler olması istenir. Bu duurmda std::integer_sequence kullanılır/ in main()
for (int i = 1; i <= 100; i++) {
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
ÖrnekElmizde şöyle bir kod olsun.
template <typename T, T... S, typename F>
constexpr void for_sequence(std::integer_sequence<T, S...>, F f) {
(static_cast<void>(f(std::integral_constant<T, S>{})), ...);
}
Açıklaması şöyle.This function takes an integer sequence and instantiate the lambda F as many time as the length of the sequence.
Çağırmak için şöyle yaparız.
for_sequence(std::make_index_sequence<100>(), [](auto N) { /* N is from 0 to 99 */
A<N + 1> a; /* N + 1 is from 1 to 100 */
a.functionCalls();
});
ÖrnekElimizde generate_tuple diye bir kod olsun ve std::tuple nesnesini bizim için kolayca tanımlasın.
Yani şu kod true dönsün istiyoruz.
int main()
{
using gen_tuple_t = generate_tuple_type<int, 3>::type;
using hand_tuple_t = std::tuple<int, int, int>;
static_assert( std::is_same<gen_tuple_t, hand_tuple_t>::value, "different" );
}
Şöyle yaparız.template <typename T, size_t N>
class generate_tuple_type {
template <typename = std::make_index_sequence<N>>
struct impl;
template <size_t... Is>
struct impl<std::index_sequence<Is...>> {
template <size_t >
using wrap = T;
using type = std::tuple<wrap<Is>...>;
};
public:
using type = typename impl<>::type;
};
Hiç yorum yok:
Yorum Gönder