gpt4 book ai didi

c++ - 嵌套 boost::multi_array?

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:47 24 4
gpt4 key购买 nike

我有一个模板类,它执行一些计算并返回 multi_array,像这样有点过于简单了:

template <typename T>
class C
{
public:
typedef boost::multi_array<T, 2> result_type;

void do_something(T const& data, unsigned i, unsigned j); // add result to R[i][j]

result_type R;
};

用简单类型实例化类 T=double工作正常。现在,我想用“T=boost::multi_array<double, 1>”实例化,但结果类型是boost::multi_array<double, 3> .

定义multi_array<multi_array<T, N>, M>>显然不会导致 multi_array<T, N+M> ,它只是一个 N 维多数组,元素是 M 维多数组 ...

产生这种类型的想法是受 Boost 手册的启发

MultiArray is recursively defined; the containers at each level of the container hierarchy model MultiArray as well. Actually, it turns out that the "elements" of the intermediate multi_array levels are of type subarray.

一个可以使用subarray生成 multi_array具有有效维度的类型 N+M ?也许以某种方式沿着以下几行:

typedef typename boost::multi_array<double, 3>::subarray<1>::type value_type;
boost::multi_array<value_type, 2> a;

我正在寻找一个相对干净的解决方案(不是冗长的 hack),如果 multi_array 接口(interface)无法做到这一点,我最好重新考虑我将要实现的设计。

最佳答案

我认为用 multi_array 类型的元素实例化 multi_array 是没有意义的(尽管它可能会编译)。例如,它不会导致连续的内存布局,因为元素自己管理内存。

为了解决引发我的问题的问题,我提出了以下解决方案:

template <typename T>
class C
{
enum { extra_rank = get_rank<T>() };
public:
typedef boost::multi_array<T, 2 + extra_rank> result_type;
}

该类根据 T 的类型定义了一个具有额外维度的 multi_array。辅助函数 get_rank 检查 T 是否为 multi_array 并返回其维数,否则返回 0。

关于c++ - 嵌套 boost::multi_array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524378/

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