Какой тип параметра я должен использовать, чтобы принимать выражения xexpression? - PullRequest
1 голос
/ 05 марта 2020

Предположим, у меня есть выражение 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);

1 Ответ

1 голос
/ 06 марта 2020

Как я прокомментировал, как правило, ваш класс должен владеть своими данными. Таким образом, вы должны создать контейнер данных, который будет вызывать оценку 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;
}

Обратите внимание, что я сократил ваши имена типов для удобства чтения.

...