gpt4 book ai didi

c++ - C++11 中由 std::tuple_size 终止的递归可变参数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:32 27 4
gpt4 key购买 nike

我在实现递归模板(模板结构中的函数)时遇到问题,它将被 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 因错误而失败:

error: template argument ‘std::tuple_size::value’ involves template parameter(s) struct Helper::value, T_arguments...>

std::tuple_size 声称在编译时已知,那么为什么我不能使用它模板特化?

最佳答案

实际上,§14.5.4/9 部分禁止您正在做的事情,该部分说,

A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.

以下内容可能会有所帮助:

template<std::size_t I = 0, typename... Tp>
inline typename std::enable_if<I == sizeof...(Tp), void>::type
total_value_size(size_t& return_size, const std::tuple<Tp...>& t)
{ }

template<std::size_t I = 0, typename... Tp>
inline typename std::enable_if<I < sizeof...(Tp), void>::type
total_value_size(size_t& return_size, const std::tuple<Tp...>& t)
{
const auto& argument (std::get<I> (t));

return_size += ::value_size(argument);
total_value_size<I + 1, Tp...>(return_size, t);
}

关于c++ - C++11 中由 std::tuple_size 终止的递归可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19902601/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com