2

好吧,这真的是一件很难的事。

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

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。

4

1 回答 1

5

如果将参数包装到一个元组中,这非常简单:

#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>

您需要做的就是std::tuple<args_t...>在您目前拥有的地方使用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
于 2013-11-03T22:43:36.263 回答