gpt4 book ai didi

c++ - 在编译时使用给定函数初始化普通二维数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:18 29 4
gpt4 key购买 nike

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

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

41 42 43
51 52 53
61 62 63

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

我想创建一个 metafunc 和一个拥有某种黑魔法的结构,这允许我从 x 的给定值集中定义一个数组。和 y .像这样:

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

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

template<int... args1>
template<int... args2>
const int Rows<args1...>::Cols<args2...>::data[sizeof...(args1)][sizeof...(args2)] = {
{ Func<args1>::over<args2>::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<args1>::over<args2>::value里面有两个参数包,args1args2 , 所以应用 ...在上面同时扩展它们,我只有 3 个成员而不是 9 个。

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

我知道 this answerthat answer .他们使用 std::array而不是普通数组,所以他们首先构造一维数组,然后用一些一维数组初始化二维数组。但如果我理解正确的话,这个初始化必须在运行时完成。我想避免这种情况。不过,我对std::array没有异议。 .我想如果使用合适的编译器,它们和普通数组一样快。

顺便说一句,这是我的possible solution使用广义 constexpr来自 C++14 和一个关于它的问题。关于如何使用 constexpr 解决任务的任何想法来自 C++11 的也欢迎。

最佳答案

我找到的唯一方法是用逗号分隔参数包,然后展开其中一个,然后从外面展开另一个:

#include <array>
#include <utility>

using namespace std;

template<class T, T Y, T... Xs>
constexpr array<T, sizeof...(Xs)> a1{10*Y+Xs...};

template<class T, T... Xs, T... Ys>
constexpr auto a2(integer_sequence<T, Xs...>, integer_sequence<T, Ys...>) {
return array<array<T, sizeof...(Xs)>, sizeof...(Ys)>{a1<T, Ys, Xs...>...};
}

array<array<int, 3>, 3> table(a2(
integer_sequence<int, 1, 2, 3>(),
integer_sequence<int, 4, 5, 6>()
));

汇编结果是这样的:

table:
.long 41
.long 42
.long 43
.long 51
.long 52
.long 53
.long 61
.long 62
.long 63

Code in Compiler Explorer

关于c++ - 在编译时使用给定函数初始化普通二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34186717/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com