我正在使用Eigen 3.1.1庫和MS Visual C++ 2010.我想實現一個簡單的併發緩衝區來控制對一個元素的訪問通用類型T.Eigen 3並根據模板參數重載新運算符以確保正確對齊
由於我使用Eigen類型,因此如果使用固定大小的可矢量化Eigen類型實例化緩衝區,則必須重載併發緩衝區的新運算符。另見: Structures Having Eigen Members。
#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」中,以便所有派生類不需要添加特定於本地的實現?