加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 采用N个参数并返回N个值的高性能解决方案

发布时间:2020-12-16 09:54:55 所属栏目:百科 来源:网络整理
导读:我可以使用什么来创建一个函数需要N个参数,其中N在编程时不知道但在编译时是固定的(事实上它是模板参数)? 有问题的函数是一个访问函数,它位于一个性能关键路径中,所以我正在寻找可能性最小的开销. 首先想到的是std :: initializer_list,虽然便宜,但据我所知
我可以使用什么来创建一个函数需要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检查,但这通常是过度的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读