0

I'm currently using xtensor for an application, and I wanted to wrap over the tensors to make a class called BitArray.

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"
#include "xtensor/xindex_view.hpp"

xt::xarray<double> arr {1, 2, 3};

template <typename E>
class BitArray{
public:
    BitArray(const xt::xexpression<E>& _array, float _alpha) :
        b(xt::cast<std::int8_t>(_array.derived_cast())), alpha(_alpha) {}
    xt::xarray<E> b;
    float alpha;
};

template <class E>
auto make_bitarray(xt::xexpression<E>& expr, float alpha)
{
    return BitArray<E>(expr, alpha);
}

auto a = make_bitarray(arr, 3); // Error

I get the error message below:

Standard Exception: Precondition violation!
Internal error: trivial_assigner called with unrelated types.
  /srv/conda/include/xtensor/xassign.hpp(505)

What does this mean and what can I do to resolve this?

4

2 回答 2

2

稍微好一点的解决方案是在你的make_bitarray函数中创建强制转换:

template <typename T>
class BitArray{
public:
    BitArray(T&& _array, float _alpha) :
        b(std::move(_array)), alpha(_alpha)
    {
    }

    T&& b;
    float alpha;
};

template <class T>
auto make_bitarray(const xt::xexpression<T>& expr, float alpha)
{
    auto cast = xt::cast<int8>(expr);
    // need to move temporary here
    return BitArray<decltype(cast)>(std::move(expr), alpha);
}
于 2018-07-27T07:07:33.830 回答
0

这就是我为复杂的模板参数提供包装器所做的事情:

template <typename T>
class BitArray{
public:
    BitArray(const xt::xexpression<T>& _array, float _alpha) :
        b(xt::cast<int8>(_array.derived_cast())), alpha(_alpha)
    {
    }

    decltype(xt::cast<int8>(std::declval<std::add_lvalue_reference_t<T>>())) b;
    float alpha;
};

template <class T>
auto make_bitarray(const xt::xexpression<T>& expr, float alpha)
{
    return BitArray<T>(expr, alpha);
}

添加一个左值,因为我检查了唯一缺少的东西是一个 ref,你需要derived_cast为了拥有value_type,然后你需要将它包装在 anxexpression中以确保它可以被评估,decltype这会给你答案.

于 2018-07-27T05:36:32.123 回答