尝试从元组中删除最后一个类型失败

2024-01-10

我正在尝试删除元组的最后一个元素。当我在元组中只有一个元素需要删除时,它会起作用。但当我有不止一个时,事情就会出错。我不明白为什么这不起作用。这些是我收到的错误:

prog.cpp:在函数‘int main()’:
prog.cpp:24:22: 错误:类型不完整‘remove_last<std::tuple<int, int> >’ 用于嵌套名称说明符
prog.cpp:24:22: 错误:类型不完整‘remove_last<std::tuple<int, int> >’ 用于嵌套名称说明符
prog.cpp:24:70: 错误:模板参数 1 无效

#include <tuple>
#include <type_traits>

template <class T>
struct remove_last;

template <class T>
struct remove_last<std::tuple<T>>
{
    using type = std::tuple<>;
};

template <class... Args, typename T>
struct remove_last<std::tuple<Args..., T>>
{
    using type = std::tuple<Args...>;
};

int main()
{
    std::tuple<int, int> var;

    static_assert(
        std::is_same<remove_last<decltype(var)>::type,
        std::tuple<int>>::value, "Values are not the same"
    );
}

当我在其中一种专业化中将模板参数设置为非可变参数时,错误就会消失。但随后这就变成了一种专门化,它只会处理具有两个元素的元组 - 这不是我的目标。我怎样才能让它发挥作用with可变参数?换句话说,当元组中有多个元素时,如何才能使其发挥作用?


问题在于参数包是贪婪的,并且 - 因为它首先出现 - 在执行类型推导时会吃掉序列中的所有类型,包括T你期望被排除在外Args....

您可以通过这种方式定义可变参数专业化(请注意,参数包现在出现last in std::tuple<T, Args...>):

template <class T, class... Args>
struct remove_last<std::tuple<T, Args...>>
{
    using type = typename concat_tuple<
        std::tuple<T>,
        typename remove_last<std::tuple<Args...>>::type
        >::type;
};

并且拥有concat_tuple元函数这样定义:

template<typename, typename>
struct concat_tuple { };

template<typename... Ts, typename... Us>
struct concat_tuple<std::tuple<Ts...>, std::tuple<Us...>>
{
    using type = std::tuple<Ts..., Us...>;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试从元组中删除最后一个类型失败 的相关文章

随机推荐