我尝试了以下代码,但它给出了:
main.cpp:29:22:错误:聚合'pop<std::tuple<int, char, float> > p'
类型不完整且无法定义
我想念什么?
template <typename T>
struct pop;
template <typename E, typename... Ts>
struct pop<tuple<Ts..., E>> {
using result = tuple<Ts...>;
};
tuple<int, char, float> t;
typename pop<decltype(t)>::result p;
如果Ts ...必须在类型列表的末尾,为什么在本示例中它可以通过http://en.cppreference.com/w/cpp/language/parameter_pack起作用:
template<class A, class B, class...C> void func(A arg1, B arg2, C...arg3)
{
container<A,B,C...> t1; // expands to container<A,B,E1,E2,E3>
container<C...,A,B> t2; // expands to container<E1,E2,E3,A,B>
container<A,C...,B> t3; // expands to container<A,E1,E2,E3,B>
}
tuple<Ts..., E>
是非推论上下文。[temp.deduct.type] / 9:
如果
P
具有包含<T>
或的形式<i>
,则将各个模板参数列表的每个参数P
i与的模板参数列表P
的对应参数A
i进行比较A
。如果的模板参数列表P
包含的包扩展不是最后一个模板参数,则整个模板参数列表都是非推导上下文。
这意味着您无法完全匹配您的部分专业化知识。
使用C ++ 14,可以使用
template <class T, class=std::make_index_sequence<std::tuple_size<T>::value-1>>
struct pop;
template <typename Tuple, std::size_t... indices>
struct pop<Tuple, std::index_sequence<indices...>>
{
using type = std::tuple<std::tuple_element_t<indices, Tuple>...>;
};
template <typename T>
using pop_t = typename pop<T>::type;
这样的
using t = std::tuple<int, char, float>;
static_assert( std::is_same<pop_t<t>, std::tuple<int, char>>{}, "" );
编译。
演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句