根据给定的索引集获取参数包的子集

Get the subset of a parameter pack based on a given set of indices

本文关键字:获取 参数 子集 索引      更新时间:2023-10-16

好吧,这是一个非常困难的问题。

我希望能够通过选择一组给定有效索引的参数类型来获取参数包的子集,然后将该参数包用作函数的参数列表。即:

template <size_t... indices_t>
void func(pack_subset<indices_t..., args_t...>); //incorrect syntax,
                                                 //not sure how else to write this
                                                 //args_t is predetermined, this
                                                 //function is a static member of
                                                 //a variadic class template
//For a parameter pack <float, double> and index set 0
void func(float); // <- result of template

我可以获取单个索引的类型,但是一组索引有点难,尤其是当该集的大小可变时。 语法为:

pack_index<size_t index_t, typename... args>::type

也许我可以将其中的一堆串在一起,但我不确定如何扩展indices_t以便我得到列表中每个值的pack_index。

如果你把参数包装成一个元组,那就很简单了:

#include <tuple>
template <typename T, std::size_t ...Is>
struct selector
{
    using type = std::tuple<typename std::tuple_element<Is, T>::type...>;
};

示例输入:<int, double, float, char, bool>, 1, 3

#include <iostream>
#include <demangle.hpp>
int main()
{
    std::cout
        << demangle<selector<std::tuple<int, double, float, char, bool>, 1, 3>::type>()
        << std::endl;
}

输出:

std::tuple<double, char>

您需要做的就是在当前刚刚args_t...的地方使用std::tuple<args_t...>


这里有一个替代的想法,可以将这个想法构建成更容易处理的东西:

template <typename ...Args> struct selector
{
    using T = std::tuple<Args...>;
    template <std::size_t ...Is>
    static void call(typename std::tuple_element<Is, T>::type ...args)
    {
        // ...
    }
};

用法:

selector<int, char, bool, double>::call<0, 2>(1, true);   // int, bool