【问题标题】:What parameter type should I use to accept xexpressions?我应该使用什么参数类型来接受 x 表达式?
【发布时间】:2020-03-05 20:21:29
【问题描述】:

假设我有 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&lt;xt::detail::not_equal_to, xt::xtensor_fixed&lt;double, xt::xshape&lt;1U, 366U&gt;, xt::layout_type::column_major&gt; &amp;, xt::xtensor_fixed&lt;double, xt::xshape&lt;1U, 366U&gt;, xt::layout_type::column_major&gt; &amp;&gt;

我想将waffle 传递给类构造函数:

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

我会用什么来代替???,以便我可以将waffle 传递给它?

例如

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

【问题讨论】:

  • 你应该决定你的班级应该举行什么。我假设xt::xtensor&lt;int,X&gt;xt::xarray&lt;int&gt;。这也应该是你的函数参数。通常,转换会处理所有事情。
  • @TomdeGeus 是的,但是转换为 xt::xtensor 或 xt::array 会大大降低程序速度
  • 您确定这是实际演员表,还是您的表达式已被评估的事实?无论如何,我认为除非在非常紧急的情况下,一个类应该拥有自己的数据,所以我看不出如何避免评估表达式。
  • @TomdeGeus 哦,我明白你的意思了,所以直到我调用变量之前我的表达式才被评估?这就解释了庞大的类型名称。抱歉,我对 C++ 还是很陌生,但感谢您的帮助。
  • 要将其转换为一个很好的问题,我建议您更改文件中的输入(仅存在于您的系统上),您手动指定一些简单的数组(或使用例如xt::arange)。另见stackoverflow.com/help/minimal-reproducible-example

标签: c++ parameters parameter-passing xtensor


【解决方案1】:

就像我评论的那样,根据经验,您的班级应该拥有自己的数据。因此,您应该创建一个数据容器,它将强制评估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;
}

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

【讨论】:

  • 感谢所有帮助伙伴! “根据经验,您的班级应该拥有自己的数据”,不评估数据的危险是什么?
  • 您可以想象,在您评估表达式时,评估它的对象已经超出范围。这将导致诸如分段之类的事情,或者更可能是错误的结果。因此,您应该记住,您的表达式没有对象是活动的概念,也没有对它们的任何所有权。也一样,例如用于原始指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2010-12-03
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
相关资源
最近更新 更多