【发布时间】:2013-11-11 09:12:20
【问题描述】:
我在实现递归模板(模板结构中的函数)时遇到问题,它将被 std::tuple_size 终止。
这是代码片段(我简化了代码,以强调问题):
template<int index, typename ...T_arguments>
struct Helper
{
static void func (size_t& return_size,
const std::tuple<T_arguments...>& arguments)
{
const auto& argument (std::get<index> (arguments));
return_size += ::value_size (argument);
::Helper<index + 1, T_arguments...>::func (return_size, arguments);
}
// ...
template<typename... T_arguments>
struct Helper<std::tuple_size<T_arguments...>::value, T_arguments...>
{
static void func (size_t& return_size,
const std::tuple<T_arguments...>& arguments)
{
const auto& argument (std::get<std::tuple_size<T_arguments...>::value> (arguments));
return_size += ::value_size (argument);
}
初始模板调用如下所示:
Helper<0, T_arguments...>::func (return_size, arguments);
GCC 失败并出现错误:
错误:模板参数‘std::tuple_size::value’ 涉及模板参数 struct Helper::value, T_arguments...>
std::tuple_size号称在编译时就知道了,为什么我不能用模板特化呢?
【问题讨论】:
-
你能提供一个没有缺失元素的简单例子吗? (例如这里,我们无法尝试,因为缺少
::value_size)。 -
另请注意,您的实现是错误的,因为您在专业化中访问了
tuple的边界。 -
@Jarod42 你能扩展什么是错误的吗?我是 C++ 模板的新手
-
std::get<std::tuple_size<std::tuple<T_arguments...>>::value> (arguments)是等同于char a[42]; a[42] = 0的错误,索引应位于[0; std::tuple_size<std::tuple<T_arguments...>[(或[0; std::tuple_size<std::tuple<T_arguments...> - 1])中。还要注意tuple_size中缺少的std::tuple。
标签: c++ templates c++11 recursion