Я использую библиотеку Eigen 3.1.1 и MS Visual C ++ 2010. Я хотел бы реализовать простой параллельный буфер, который контролирует доступ к элементу универсального типа T.
Поскольку я работаю с собственными типами, новый оператор параллельного буфера должен быть перегружен, если для экземпляра буфера используется векторизуемый собственный тип фиксированного размера. Смотрите также:
Структуры, имеющие собственные члены.
#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», чтобы все производные классы не нуждались в добавлении собственных конкретных реализаций?
Я взглянул на определение макроса, и кажется, что вам не нужно выполнять часть NeedsToAlign на вашей стороне. Эйген делает это уже для вас. В документации Eigen также указано, что нужно использовать только макрос (так почему бы это не было хорошим решением?).
Относительно вашего второго вопроса: оператор new будет объявлен без виртуального, поэтому я полагаю (!), Что он не будет работать.
Других решений пока нет …