我们正在为使用递归模板的范围编写通用实现
template<typename T, std::size_t n>
class range<T,n> {
// actual implementation
};
// Specialication for n = 0
实际的实施可以在https://github.com/jyujin/libefgy/blob/master/include/ef.gy/range.h
找到到目前为止,这种方法效果很好,但是如果范围超过256个元素会遇到问题,因为你有一个带限制的模板递归。
为了防止这种情况,我们的想法是将所有内容专门化,超过一定数量,例如超过255的大小。
你怎么能写一些条件,可能是使用enable_if?
答案 0 :(得分:1)
可能的解决方法/ 解决是将给定模板实例化为
template class range<int, 255>;
现在,您的n
将有255 + recursiveLimit
的新限制
您还必须专注于T
类型: - /
修改强> 现在我们有OP的代码:)
据我所知,你的递归是创建一个序列{0,1,2,..,N - 1}
执行此操作的线性方法将很快达到递归限制N == limit
。
以下将使用分而治之的方法来完成工作:
所以你应该在N ~= 2 ** limit
template <int ... Is> struct index_sequence {};
// Helper to concatenate several sequences
template<typename ... Ts> struct concat_seq;
template<int ... Is, int ...Is2, typename ... Ts>
struct concat_seq<index_sequence<Is...>, index_sequence<Is2...>, Ts...>
{
typedef typename concat_seq<index_sequence<Is..., Is2...>, Ts...>::type type;
};
template<int ... Is>
struct concat_seq<index_sequence<Is...>>
{
typedef index_sequence<Is...> type;
};
// Some test
static_assert(std::is_same<typename concat_seq<index_sequence<1>, index_sequence<2>, index_sequence<3>>::type, index_sequence<1, 2, 3>>::value, "");
// Helper to create the sequence
template <int N, int Offset = 0> struct make_seq;
template <int Offset> struct make_seq<0, Offset>
{
typedef index_sequence<> type;
};
template <int Offset> struct make_seq<1, Offset>
{
typedef index_sequence<Offset> type;
};
// Split the sequence to generate in two part (recursively)
template <int N, int Offset> struct make_seq
{
typedef typename concat_seq<typename make_seq<N / 2, Offset>::type,
typename make_seq<N - N / 2, Offset + N / 2>::type>::type type;
};
// test
static_assert(std::is_same<typename make_seq<5>::type, index_sequence<0, 1, 2, 3, 4>>::value, "");
static_assert(std::is_same<typename make_seq<5, 2>::type, index_sequence<2, 3, 4, 5, 6>>::value, "");
// Final test
template struct make_seq<10000>; // This work for me