我尝试实现C++ 14别名模板make_integer_sequence,这简化了类模板的创建integer_sequence.
template< class T, T... I> struct integer_sequence
{
typedef T value_type;
static constexpr size_t size() noexcept { return sizeof...(I) ; }
};
template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
Run Code Online (Sandbox Code Playgroud)
为了实现,make_integer_sequence我们需要一个辅助结构make_helper.
template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Run Code Online (Sandbox Code Playgroud)
实施make_helper并不太难.
template< class T, T N, T... I >
struct make_helper
{
typedef …Run Code Online (Sandbox Code Playgroud) 我知道如何选择可变参数模板的第一个参数:
template< class...Args> struct select_first;
template< class A, class ...Args> struct select_first<A,Args...>{ using type = A;};
Run Code Online (Sandbox Code Playgroud)
这很简单.但是,select_last不相似:
template< class ...Args> struct select_last;
template< class A> struct select_last<A> { using type = A; };
template< class A, class Args...> struct select_last<A,Args...>{
using type = typename select_last<Args...>::type;
};
Run Code Online (Sandbox Code Playgroud)
该解决方案需要深度递归模板即时.我尝试用以下方法解决这个问题:
template< class A, class Args...>
struct select_last< Args ... , A>{ using type = A; }; // but it's not compiled.
Run Code Online (Sandbox Code Playgroud)
问:存在更有效的方法来选择可变参数模板的最后一个参数吗?
我正在尝试删除元组的最后一个元素.当我在元组中只有一个元素要移除时,它可以工作.但是当我不止一个时,事情就出错了.我不明白为什么这不起作用.这些是我得到的错误:
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"
);
}
Run Code Online (Sandbox Code Playgroud)
当我在其中一个特化中使模板参数非变量时,错误消失了.但后来这变成了一个专门化,它只会处理一个有两个元素的元组 - 而不是我的目标.如何使用可变参数进行此操作?换句话说,当元组中有多个元素时,如何才能使它工作?