我知道如何选择可变参数模板的第一个参数:
template< class...Args> struct select_first;
template< class A, class ...Args> struct select_first<A,Args...>{ using type = A;};
这很简单。不过 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;
};
此解决方案需要深度递归模板实例化。 我尝试用以下方式解决这个问题:
template< class A, class Args...>
struct select_last< Args ... , A>{ using type = A; }; // but it's not compiled.
问:有没有更有效的方法来选择可变参数模板的最后一个参数?
最佳答案
使用 C++17,最简洁的方法是
template<typename T>
struct tag
{
using type = T;
};
template<typename... Ts>
struct select_last
{
// Use a fold-expression to fold the comma operator over the parameter pack.
using type = typename decltype((tag<Ts>{}, ...))::type;
};
实例化深度为 O(1)。
关于c++ - 选择可变参数模板最后一个参数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18942322/