我正在尝试删除元组的最后一个元素。当我在元组中只有一个元素需要删除时,它会起作用。但当我有不止一个时,事情就会出错。我不明白为什么这不起作用。这些是我收到的错误:
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(使用前将#替换为@)