2013-06-30 2 views
1

Я пытаюсь создать простой распознаватель жестов для приложения 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; 

Это, безусловно, работает, но мне было интересно, если там есть лучшее решение.

Спасибо за чтение и за помощь.

+1

Есть ли причина, по которой вы пытаетесь сохранить «PointerPoint» вместо «PointerPoint ^»? – MSalters

+0

Eh, ну, моя интуиция заключалась в том, что я скорее скопировал бы память, чем сохранил бы ссылку на нее для пожизненных проблем, но я полагаю, что поскольку^является считанным смарт-указателем ref, то хранимый PointerPoint не должен выходить за рамки, если я держите ручку на ней указателем ^. Правильно? – Nico

+0

Я спрошу, что PointerPoint, по-видимому, является управляемым объектом, т. Е. Его хранилище управляется CLR. Попытка _also_ управлять им через Boost является основной причиной. – MSalters

ответ

2

Если вы хотите поместить ссылочный тип в коллекцию STL, вам нужно использовать форму ^. Поэтому вы должны использовать: boost::circular_buffer<PointerPoint^> вместо boost::circular_buffer<PointerPoint>. Windows :: Foundation :: Point - это тип значения, поэтому он может использоваться в коллекции напрямую.

+0

Да, все. Спасибо за помощь! – Nico

0

Я думаю, что случайно нашел рабочее решение, используя этот объект Windows :: Foundation :: Point в моей структуре LocalPoint. Просто оберните объект WinRT структурой, а затем операторы будут работать нормально, но это добавит немного синтаксического шума.

Однако я все еще слушаю лучшее решение, но я оставлю это здесь до тех пор.