Я пытаюсь создать простой распознаватель жестов для приложения D3D. Жест распознаватель работает, сохраняя каждую точку, полученную в повышении :: circular_buffer емкости 3, а затем подсчет количества подобных FrameID х в буфере, например, так:Можно ли использовать объекты WinRT в STL-подобных контейнерах?
UINT Trackball::CalculateGestureSize(Windows::UI::Input::PointerPoint^pPoint)
{
// shift the circular buffer queue one if it's full (common case)
if (m_pointQueue.full())
{
m_pointQueue.pop_back();
}
// then store our point
m_pointQueue.push_front(*pPoint);
// now we need to see how many of the points in the
// circular buffer match the frame Id
UINT gestureLength = 0;
for (UINT i = 0; i < MAX_GESTURE_SIZE; i += 1)
{
if (m_pointQueue[i].FrameId == pPoint->FrameId)
{
gestureLength += 1;
}
}
assert(gestureLength != 0);
return gestureLength;
}
Однако компилятор не может понять, как для создания экземпляра этого типа:
// a queue of size 3 that helps determine what kind of gesture we're working with
boost::circular_buffer<Windows::UI::Input::PointerPoint> m_pointQueue;
потому & и * не могут быть использованы на WinRT объектов:
boost/concept_check.hpp(195): error C3699: '&' : cannot use this indirection on type 'const Windows::UI::Input::PointerPoint' compiler replacing '&' with '^' to continue parsing
список ошибок компилятора затем быстро растет очень быстро из-за каскадных эффектов этой ошибки.
Прямо сейчас, мое решение скопировать необходимую информацию для PointerPoint в структуры и использовать его в качестве TypeName подпиточного :: circular_buffer, как и так:
// So WinRT objects (like Windows::UI::Input::PointerPoint) can't
// be used in STL-like containers (like boost::circular_buffer)
// because * and & operators cannot be used on them, so I'm copying
// the necessary info into this struct and using that instead
typedef struct
{
UINT FrameId;
Windows::Foundation::Point Position;
} LocalPoint;
// a queue of size 3 that helps determine what kind of gesture we're working with
boost::circular_buffer<LocalPoint> m_pointQueue;
Это, безусловно, работает, но мне было интересно, если там есть лучшее решение.
Спасибо за чтение и за помощь.
Есть ли причина, по которой вы пытаетесь сохранить «PointerPoint» вместо «PointerPoint ^»? – MSalters
Eh, ну, моя интуиция заключалась в том, что я скорее скопировал бы память, чем сохранил бы ссылку на нее для пожизненных проблем, но я полагаю, что поскольку^является считанным смарт-указателем ref, то хранимый PointerPoint не должен выходить за рамки, если я держите ручку на ней указателем ^. Правильно? – Nico
Я спрошу, что PointerPoint, по-видимому, является управляемым объектом, т. Е. Его хранилище управляется CLR. Попытка _also_ управлять им через Boost является основной причиной. – MSalters