假设我有xtensor xexpression waffle

xt::xtensor_fixed<double, xt::xshape<1, 4>, xt::layout_type::column_major> open = {{1., 3., 2., 5.}};
xt::xtensor_fixed<double, xt::xshape<1, 4>, xt::layout_type::column_major> close = { {5., 1., 6., 2.} };
auto waffle = xt::equal(open, close);

考虑到waffle的类型是:xt::detail::xfunction_type_t<xt::detail::not_equal_to, xt::xtensor_fixed<double, xt::xshape<1U, 366U>, xt::layout_type::column_major> &, xt::xtensor_fixed<double, xt::xshape<1U, 366U>, xt::layout_type::column_major> &>
我想将waffle传递给类构造函数:

class WaffleWrapper {
public:
    ??? waffle;
    WaffleWrapper(??? wafflein) {
        ??? waffle = wafflein;
    }
};


我将使用什么代替???以便将waffle传递给它?

例如

auto waffle = xt::equal(open, close);
WaffleWrapper example(waffle);

最佳答案

就像我评论的那样,作为一种经验法则,您的类应该拥有自己的数据。因此,您应该创建一个数据容器,该容器将强制评估xfunction。此后,您不必担心指向可能超出范围的数据。

如果您担心失去使用数组固定性的能力,则可以考虑对类进行模板化:

#include <xtensor/xarray.hpp>
#include <xtensor/xfixed.hpp>
#include <xtensor/xview.hpp>
#include <xtensor/xio.hpp>

template<class T>
class WaffleWrapper {
public:
    T waffle;

    WaffleWrapper(const T& wafflein) {
        waffle = wafflein;
    }
};

int main()
{
    using fixed_double = xt::xtensor_fixed<double, xt::xshape<1, 4>, xt::layout_type::column_major>;
    using fixed_int = xt::xtensor_fixed<int, xt::xshape<1, 4>, xt::layout_type::column_major>;

    fixed_double open = {{1., 3., 2., 5.}};
    fixed_double close = {{5., 1., 6., 2.}};
    auto waffle = xt::equal(open, close);

    WaffleWrapper<fixed_int> example(waffle);

    return 0;
}

请注意,为了便于阅读,我缩写了您的类型名。

10-07 13:20