当前位置:  开发笔记 > 编程语言 > 正文

在编译时使用给定函数初始化纯2D数组

如何解决《在编译时使用给定函数初始化纯2D数组》经验,为你挑选了0个好方法。

我想创建一个由一些已知函数填充的2D数组,没有运行时开销.

有一个例子,假设一个功能f(x, y) = 10 * y + x,让x{1, 2, 3}y{4, 5, 6}.我想创建一个包含内容的2D数组

41 42 43
51 52 53
61 62 63

现在,最简单的方法就是直接在我的源代码中对值进行硬编码.这确实适合我的任务,所以问题只是出于好奇.

我想创建一个metafunc和结构具有某种魔法,这让我定义数组出给定值的集合的拥有xy.像这样:

template struct Func {
  template struct over {
    static const int value = 10 * Y + X;  // f(x, y)
  };
};

template struct Rows {
  template struct Cols {
    static const int data[sizeof...(args1)][sizeof...(args2)];
  };
};

template
template
const int Rows::Cols::data[sizeof...(args1)][sizeof...(args2)] = {
  { Func::over::value... }  // This does not do what I want :(
                                          // Need some black magic here
};

// Here is my precious table
const auto& table = Rows<1, 2, 3>::Cols<4, 5, 6>::data;

如果我从表中打印值,我有:

41 52 63
 0  0  0
 0  0  0

我明白发生了什么,术语Func::over::value有两个参数包在里面,args1args2,因此应用...上他们同时展开,而我只有3名成员,而不是9.

如果到目前为止,你已经明白了我想要的东西.所以问题是,我该怎么做?如何将省略号分别应用于两个参数包,以便我可以在初始化程序中使用笛卡尔组合?或者也许有其他方法可以做到这一点?

我知道这个答案和答案.它们使用std::array而不是普通数组,因此它们首先构造1D数组,然后使用多个1D数组初始化2D数组.但如果我理解正确,这个初始化必须在运行时完成.我想避免这种情况.但是,我没有异议std::array.我认为通过适当的编译器,它们与普通数组一样快.

顺便说一下,这是我使用C++ 14中的通用解决方案constexpr和关于它的问题的可能解决方案.关于如何使用constexprC++ 11 解决任务的任何想法也受到欢迎.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有