【发布时间】:2019-03-29 00:28:33
【问题描述】:
我在玩一个看似曲解的想法,但我喜欢挑战,尽管它只是我发明的 C++ 练习。
任务是在 d 维中存储一系列 n 标量。想象一下,有一个向量、一个矩阵或一个由 n 个双精度数或整数或其他值组成的 3D 矩阵,并在运行时选择有多少个(手动计算,没什么特别的)。
例如,假设我想要一个长 4 的两个双精度数组(n == 2、d == 1,在运行时我说我想要存储 4):
| d0 d1 | d0 d1 | d0 d1 | d0 d1 |
或 3 个双精度的 2D 2x4 网格(n == 3、d == 2,在运行时我说我想要存储 2 * 4):
| d0 d1 d2 | d0 d1 d2 | d0 d1 d2 | d0 d1 d2 |
| d0 d1 d2 | d0 d1 d2 | d0 d1 d2 | d0 d1 d2 |
我如何访问例如网格的i, j-th 元素?使用运算符,当然......但我想编写一个 single 运算符,返回一个 引用元组 到三个双精度数。
给出一个想法:
template <std::size_t n, std::size_t d, typename Number>
class storage
{
public:
// Magic tricks here?
auto operator()(std::size_t i_0, ..., std::size_t i_d) -> std::tuple<n std::ref<Number>s>
{
}
};
问题是,我怎样才能在这里玩一些神奇的模板技巧来定义返回 同构类型元组的 one 运算符?
我发现特别难以考虑如何定义该元组,当然还有必须完全具有 d 参数的运算符。
至于用法,我希望能够像在 2D 示例中这样工作:
// define a matrix of three doubles
storage<3, 2, double> storageobj(8);
// get a block, these should be references
auto block = storageobj(0, 1);
std::get<0>(block) = -123.456;
请注意,我现在并不关心如何访问内存中元素的实际实现,但返回类型的定义以及如何制作 operator() 是本练习的主要目标。
一些神奇的 TMP 可以在这里提供帮助吗?
【问题讨论】:
-
您可以使用来自here 的信息创建这样一个元组。我会写下来,但我认为有人会更快。那么操作符 impl 本身就很简单了。
-
如果类型相同,
std::array可能更合适。 -
所以你想要一个由 n 维向量组成的 d 维矩阵,但是什么决定了矩阵的大小?此外,这听起来很像 boost::multi_array。
-
我根据@Quentin 的评论修改了问题。我在运行时传递存储的长度,计算我需要多少块(行乘以列)。不,我想避免提升,只要我能享受编码的乐趣。
-
@senseiwa - 抱歉,但我不清楚所涉及的维度。哪个维度是已知的运行时和一个编译时(并且可能是某个地方的模板参数)。您可以添加一些预期声明/初始化和使用的示例吗?
标签: c++ templates multidimensional-array