c++ - 选择可变参数模板最后一个参数的有效方法

标签 c++ c++11 variadic-templates

我知道如何选择可变参数模板的第一个参数:

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/

相关文章:

c++ - 转换到同一类型

c++ - 在 C++ 中使用 #include 包含多个

c++ - 格式错误的调用的零长度可变参数扩展

c++ - 从 Windows 应用程序发送短信

c++ - 使用逻辑运算符时无法理解执行情况

c++ - 通过使用来自同一类 C++ 的函数内部的指针 vector 访问数据

c++ - 方法接受函数指针的可变参数模板

c++ - std::common_type 应该使用 std::decay 吗?

c++ - 如何使用线程安全函数将元素添加到数组?

c++ - 迭代多个模板参数的递归模板函数