我想将Eigen3用作简单实时音频处理库的后端引擎。关键的想法是通过一系列完全模板化的处理器传递Eigen-exressions,每个处理器返回一个修改的特征表达式。如果这些表达式可以携带时间戳或其他合理的元数据,那将非常有用。
例如,我希望能够执行以下操作:给定
Signal X(3, 1);
X << 1 , 0 , 0;
X.start_time = 0;
Signal Y(3, 1);
Y << 2 , 0 , 0;
Y.start_time = 2;
Signal Z(5, 1);
Z << 1, 0, 2, 0, 0;
Z.start_time = 0;
然后以下表达式shuold评估为true
(Z == X + Y).all();
(X+Y).start_time == 0;
我试图扩展Eigen :: Array类:我正在使用插件 如here所述,在ArrayBase类中添加数据成员,并且我已经使用documentation中描述的相应的constructore和赋值运算符定义了一个子类。设置/获取数据成员直接工作正常。 (见下面的例子)
但是,当我构造一个表达式并将其分配给另一个Signal时,不会复制该成员。这实际上很清楚,因为表达式的构造不涉及Signal构造函数,而是类层次结构中较高的一些构造函数。 据我所知,我无法在插件中实现自定义构造函数/赋值操作,因为它们已在相应的vanilla类中定义。
// ./eigen_extension.h
int my_member; // plugin to declare my_member in the eigen base class.
// main.cpp
#define EIGEN_DENSEBASE_PLUGIN "./eigen_extension.h"
#include <Eigen/Dense>
class Signal : public Eigen::ArrayXXf
{
using Base = Eigen::ArrayXXf;
public:
Signal(): Base()
{
this->my_member = 0;
}
template <typename OtherDerived>
Signal(const Eigen::ArrayBase<OtherDerived>& other)
: Base(other)
{
std::cout << "cpy ctor my_member: " << this->my_member << ", other: " << other.my_member << std::endl;
this->my_member = other.my_member;
}
template <typename OtherDerived>
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE
Signal& operator=(const Eigen::ArrayBase<OtherDerived>& other)
{
this->Base::operator=(other);
std::cout << "cpy ass my_member: " << this->my_member << ", other: " << other.my_member << std::endl;
this->my_member = other.my_member;
return *this;
}
};
int main(int argc, char* argv[])
{
Signal X;
X.my_member = 5;
std::cout << X.my_member << std::endl; // prints 5
auto Y = X * X; // invokes copy ctor, prints cpy ctor my_member: -858993460, other: -858993460
//Signal Y(X);
std::cout << Y.my_member << std::endl; // prints -858993460, should print 5.
}
我还尝试了上述代码的一些变体,包括使用通用引用制作构造函数/ assignemnt运算符或将插件放置到特征类层次结构的不同级别。
我的问题是,是否以及如何使我的方案有效。