Собственное 3 и перегрузка нового оператора в зависимости от параметра шаблона для обеспечения правильного выравнивания

Я использую библиотеку 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», чтобы все производные классы не нуждались в добавлении собственных конкретных реализаций?

1

Решение

Я взглянул на определение макроса, и кажется, что вам не нужно выполнять часть NeedsToAlign на вашей стороне. Эйген делает это уже для вас. В документации Eigen также указано, что нужно использовать только макрос (так почему бы это не было хорошим решением?).

Относительно вашего второго вопроса: оператор new будет объявлен без виртуального, поэтому я полагаю (!), Что он не будет работать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]