(C++11) 可变模板序列打印
(C++11) Variadic template sequence printing
我得到了一个模板元编程挑战,即仅使用 C++11 标准打印出一系列 2 的幂的整数,我已经成功完成了:
#include <iostream>
template <size_t... Ns>
struct index_sequence
{
static void print()
{
const size_t numbers[] = {Ns...};
for (const auto& number : numbers)
{
std::cout << number << ", ";
}
std::cout << std::endl;
}
};
//#include <cmath>
template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
static_cast<size_t>(1) << Counter, Rest...>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<static_cast<size_t>(1) << 0, Rest...>;
};
template <size_t T>
using make_sequence = typename make_sequence_impl<T>::type;
int main()
{
make_sequence<N>::print();
}
假设 N 是 5,它会打印 1, 2, 4, 8, 16。
然而,我随后被要求做同样的事情,除了这次我必须以相反的顺序打印它们(即 16、8、4、2、1 表示 N = 5)。我完全被难住了,但我非常确定它只涉及对代码的轻微更改,我不知道如何更改。
如有任何帮助,我们将不胜感激。前几天接触到模板元编程
不确定这是否是最小的变化,但您可能 "push_back 而不是 ""push_front" 序列".
template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
Rest...,
static_cast<size_t>(1) << Counter>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<Rest..., static_cast<size_t>(1) << 0>;
};
在我这边,我会模仿std::make_index_sequence
有0, 1, 2, .., N-1
然后直接使用它:
emplate <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
Counter,
Rest...>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<0, Rest...>;
};
然后
template <std::size_t ... Is>
void print( index_sequence<Is...> )
{
for (const auto& number : {Is...})
{
std::cout << number << ", ";
}
std::cout << std::endl;
}
template <std::size_t ... Is>
void print_pow2( index_sequence<Is...> )
{
print(index_sequence<(1u << Is)...>{});
}
template <std::size_t ... Is>
void print_pow2_inv( index_sequence<Is...> )
{
print(index_sequence<(1u << (sizeof...(Is) - 1 - Is))...>{});
}
我得到了一个模板元编程挑战,即仅使用 C++11 标准打印出一系列 2 的幂的整数,我已经成功完成了:
#include <iostream>
template <size_t... Ns>
struct index_sequence
{
static void print()
{
const size_t numbers[] = {Ns...};
for (const auto& number : numbers)
{
std::cout << number << ", ";
}
std::cout << std::endl;
}
};
//#include <cmath>
template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
static_cast<size_t>(1) << Counter, Rest...>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<static_cast<size_t>(1) << 0, Rest...>;
};
template <size_t T>
using make_sequence = typename make_sequence_impl<T>::type;
int main()
{
make_sequence<N>::print();
}
假设 N 是 5,它会打印 1, 2, 4, 8, 16。
然而,我随后被要求做同样的事情,除了这次我必须以相反的顺序打印它们(即 16、8、4、2、1 表示 N = 5)。我完全被难住了,但我非常确定它只涉及对代码的轻微更改,我不知道如何更改。
如有任何帮助,我们将不胜感激。前几天接触到模板元编程
不确定这是否是最小的变化,但您可能 "push_back 而不是 ""push_front" 序列".
template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
Rest...,
static_cast<size_t>(1) << Counter>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<Rest..., static_cast<size_t>(1) << 0>;
};
在我这边,我会模仿std::make_index_sequence
有0, 1, 2, .., N-1
然后直接使用它:
emplate <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
Counter,
Rest...>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<0, Rest...>;
};
然后
template <std::size_t ... Is>
void print( index_sequence<Is...> )
{
for (const auto& number : {Is...})
{
std::cout << number << ", ";
}
std::cout << std::endl;
}
template <std::size_t ... Is>
void print_pow2( index_sequence<Is...> )
{
print(index_sequence<(1u << Is)...>{});
}
template <std::size_t ... Is>
void print_pow2_inv( index_sequence<Is...> )
{
print(index_sequence<(1u << (sizeof...(Is) - 1 - Is))...>{});
}