根据给定的索引集获取参数包的子集
Get the subset of a parameter pack based on a given set of indices
好吧,这是一个非常困难的问题。
我希望能够通过选择一组给定有效索引的参数类型来获取参数包的子集,然后将该参数包用作函数的参数列表。即:
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
相关文章:
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何使用可变参数模板获取参数的变量号及其大小C++
- 如何从 x64 程序集中的堆栈中获取参数?
- 从命令行获取参数时出现问题
- 函数获取参数的变量列表并将它们转换为一系列字节?
- 当函数在C++中获取参数时,为什么要使用取消引用
- C++是否在 for 循环之前获取参数
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 获取参数的子类
- 如何循环访问在 cmd 中获取参数的 exe 文件
- 一种从元组/数组获取参数包的方法
- 如何获取参数包中元素的索引
- 延长函数的寿命延长 由 const& 获取参数并由 const& 返回
- 我的二传手可以获取参数,但实际上不能?
- 如何获取参数[0]
- 可以用于获取参数类型的 decltype
- 使用常量,获取参数表而不是复制
- C++11、14 或 17 是否提供了一种从 decltype() 中获取参数的方法?
- 根据给定的索引集获取参数包的子集
- 为什么 std::not1() 通过常量引用而不是按值获取参数