c – 采用N个参数并返回N个值的高性能解决方案
我可以使用什么来创建一个函数需要N个参数,其中N在编程时不知道但在编译时是固定的(事实上它是模板参数)?
有问题的函数是一个访问函数,它位于一个性能关键路径中,所以我正在寻找可能性最小的开销. 首先想到的是std :: initializer_list,虽然便宜,但据我所知,它仍然是一个不必要的对象来创建和复制.更重要的是,它有一个时髦的方式来访问其元素与initializer_list :: begin [i](这是我不关心的另一个对象)并没有完全限制N的参数数量,但这是一个小问题. 其次,有模板参数包.这些人是否可行?我将不得不使用递归来访问N值. 我的目标是我试图在这个伪代码中显示: template<int dim,class T> class linear_searchspace { template<T...args> operator() (args) { return std::tie(some_kinda_structure[args[0]],some_kinda_structure[args[1]],some_kinda_structure[args[3]]); } }; 我可以把它以递归的形式带来,它可以实现吗? 澄清:args应该是坐标.每个坐标是维度中值的索引.所以N坐标通过,将返回N个值.这就像是同时访问N个向量.我想为每个参数添加一个偏移量,它取决于参数的索引,因为它存储了一个数组,其中的偏移量索引对应于参数的索引.计算将是简单的算术. 什么是适当的返回类型?它将访问的结构最有可能保存数值,最多为元组. std :: tuple是我能做的最好的,还是可以制作更高性能的东西? 关于论点,任何事情都会发生,甚至是宏.我很高兴听到你多年来想出的伎俩. 解决方法double data[]={1,2,3,4,5,6,7,8}; double& toy_map(int x){return data[x];} template<class...Ts> auto example(Ts&&...ts) -> decltype(std::tie(toy_map(std::forward<Ts>(ts))...)) { static_assert(sizeof...(Ts)==5,"wrong parameter count"); return std::tie(toy_map(std::forward<Ts>(ts))...); } 请注意,未指定调用toy_map的顺序. 在C 14中,如果您不需要SFINAE,请删除decltype行. 在实际代码中将N替换为N. 如果你想要超载是完美的,你将不得不对SFINAE进行N检查,但这通常是过度的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |