xtensor - Tensor 包装器在运行时引发 trivial_assigner 错误
xtensor - Tensor wrapper raises trivial_assigner error during runtime
我目前正在将 xtensor 用于一个应用程序,我想将张量包裹起来制作一个名为 BitArray
的 class。
#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
我收到以下错误消息:
Standard Exception: Precondition violation!
Internal error: trivial_assigner called with unrelated types.
/srv/conda/include/xtensor/xassign.hpp(505)
这是什么意思,我该怎么做才能解决这个问题?
这就是我为复杂的模板参数提供包装器所做的工作:
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
,然后你需要将它包装在一个xexpression
以确保它可以被评估,然后 decltype
给出答案。
稍微好一点的解决方案是在 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);
}
我目前正在将 xtensor 用于一个应用程序,我想将张量包裹起来制作一个名为 BitArray
的 class。
#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
我收到以下错误消息:
Standard Exception: Precondition violation!
Internal error: trivial_assigner called with unrelated types.
/srv/conda/include/xtensor/xassign.hpp(505)
这是什么意思,我该怎么做才能解决这个问题?
这就是我为复杂的模板参数提供包装器所做的工作:
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
,然后你需要将它包装在一个xexpression
以确保它可以被评估,然后 decltype
给出答案。
稍微好一点的解决方案是在 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);
}