【发布时间】:2017-10-29 10:13:11
【问题描述】:
我试图操纵 C++14 integer_sequence,但我遇到了一个错误
不明白。让我们从可读性的快捷方式开始
template <typename Int, Int...ints>
using IS = std::integer_sequence<Int, ints...>;
我正在使用 sum 函数减少 IS。我没有为空定义它
故意排序,因为在我使用的实际用例中就是这种情况
gcd、lcm等算术函数:
template<typename ...Int> struct redsum;
template<typename Int, Int i0, Int i1, Int... ints>
struct redsum< IS<Int, i0, i1, ints...> > :
redsum< IS<Int, i0 + i1, ints...> > { };
template<typename Int, Int i0>
struct redsum<IS<Int, i0> > : std::integral_constant< Int, i0 > { };
现在我想定义尾部(lisp 中的 cdr):
template<typename Int, Int ...ints> struct tail;
template<typename Int, Int i0, Int... ints>
struct tail<Int, i0, ints...> : IS<Int, ints...> { };
template<typename Int, Int... ints>
struct tail<IS<Int, ints...> > : tail<Int, ints...> { };
但这并没有按预期工作:
// This works as expected
static_assert(redsum< IS<unsigned, 2, 5, 12, 18> >::value == 2 + 5 + 12 + 18);
// This doesn't with an incomplete type error
static_assert(redsum< tail < IS<unsigned, 2, 5, 12, 18> > >::value == 5 + 12 + 18);// EDIT
我不明白在这个用例中我的类型在哪里不完整。任何 解释或建议我应该如何写得更好?
【问题讨论】:
-
如果您使用
static_assert(5 + 12 + 18 == redsum<tail<IS<unsigned, 2, 5, 12, 18> > >::value, "")而不是std::cout,您的意图会更清楚。我猜@max66's answer 是基于误解。 -
@Julius - 我确认:我的回答是基于误解;对不起。
-
@Julius - 添加了另一个答案;希望这不会被误解,
-
@Julius:谢谢你的想法!我正在解决我的问题!
标签: c++ templates c++14 variadic-templates template-meta-programming