我正在使用 Eigen 3.1.1 库和 MS Visual C++ 2010。我想实现一个简单的并发缓冲区来控制对泛型类型 T 元素的访问。
当我使用 Eigen 类型时,如果使用固定大小的可矢量化 Eigen 类型实例化缓冲区,则必须重载并发缓冲区的 new 运算符。另请参阅: 具有特征成员的结构。
#include <boost/thread.hpp>
#include <Eigen/Geometry> // required for the eigen macro
// abstract base class for all buffers
template <class T>
class ConcurrentBuffer
{
public:
// virtual destructor to allow subclassing
virtual ~ConcurrentBuffer(){}
//virtual void get(T& elem) = 0;
//virtual void put(const T& elem) = 0;
};
template<class T>
class SingleElementStorage : public ConcurrentBuffer<T>
{
public:
// For fixed-size vect. Eigen types:
typedef T Elem_type;
enum { NeedsToAlign = (sizeof(Elem_type)%16)==0 };
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
SingleElementStorage() {}
~SingleElementStorage() {}
//void get(T& elem);
//void put(const T& elem);
private:
T elem_;
boost::shared_mutex mutex_;
};
这段代码用 MSVC++ 编译得很好。我的问题是这是否是实现这种缓冲区的最佳方式。实际上,如果仅使用 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 并删除 typedef 和 enum,则此代码也可以编译。
那么为什么我不应该简单地将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 放在我项目的每个结构/类中呢?
另一个相关问题:是否有可能将宏放入抽象基类“ConcurrentBuffer”中,以便所有派生类都不需要添加特定于特征的实现?