【发布时间】:2014-06-07 09:02:47
【问题描述】:
我正在尝试通过一个名为integer_range 的新类来扩展std::integer_sequence 提供的可能性(它显然会在两个边界之间创建一个整数序列)。我的实现基于我对this question 的回答,我试图适应std::integer_sequence:
namespace details
{
template<typename Int, Int C, Int P, Int... N>
struct increasing_integer_range:
increasing_integer_range<Int, C-1, P+1, N..., P>
{};
template<typename Int, Int C, Int P, Int... N>
struct decreasing_integer_range:
decreasing_integer_range<Int, C+1, P-1, N..., P>
{};
template<typename Int, Int P, Int... N>
struct increasing_integer_range<Int, 0, P, N...>:
std::integer_sequence<Int, N...>
{};
template<typename Int, Int P, Int... N>
struct decreasing_integer_range<Int, 0, P, N...>:
std::integer_sequence<Int, N...>
{};
}
template<typename Int, Int S, Int E, bool Increasing=(S<E)>
struct integer_range;
template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, true>:
details::increasing_integer_range<Int, std::integral_constant<Int, E-S>, S>
{};
template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, false>:
details::decreasing_integer_range<Int, std::integral_constant<Int, E-S>, S>
{};
template<std::size_t S, std::size_t E>
using index_range = integer_range<std::size_t, S, E>;
我认为更改将是微不足道的(添加typename 模板参数),但这实际上在0 的特化中引入了一个依赖非类型参数的问题。这是编译器错误:
error: type `Int` of template argument `0` depends on a template parameter
基本问题already has一些解决方法。但是,由于我使用可变参数模板,修复变得更加困难:this answer 无法工作,因为我不允许在可变参数模板之后有默认模板参数。因此,我尝试实现the accepted answer 中提到的修复程序,但似乎正如 cmets 中所述,我的编译器 (g++ 4.8.1) 无法消除歧义,并认为以下两个专业化都同样专业化:
struct increasing_integer_range<Int, std::integral_constant<Int, C>, P, N...>: /* */struct increasing_integer_range<Int, std::integral_constant<Int, 0>, P, N...>: /* */
还有其他方法可以解决这个问题吗?我没有想法。
【问题讨论】:
-
this 是否不适用于 g++4.8.1?
-
如果不行,你可以试试this。
-
“不允许在可变参数模板之后有默认模板参数” 如果你包装序列并使用部分特化(例如传递已经构建的序列),这是可能的作为
std::integer_sequence)。 -
@dyp 实例化的话,第一个does not work。
-
哎呀,是的,我一直忘记 typedef 不实例化。不过,第二个有效(coliru 使用 g++4.8.2)。
标签: c++ templates template-specialization c++14 indices