是否可以在类似STL的容器中使用WinRT对象?

时间:2013-06-30 21:34:35

标签: c++ windows stl windows-runtime directx

我正在尝试为D3D应用程序创建一个简单的手势识别器。手势识别器的工作原理是将接收到的每个点存储到容量为3的boost :: circular_buffer中,然后计算缓冲区中类似FrameID的数量,如下所示:

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;

因为&amp;和*不能在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的必要信息复制到结构中,并将其用作boost :: circular_buffer的typename,如下所示:

// 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;

这肯定有效,但我想知道是否有更好的解决方案。

感谢阅读和尝试提供帮助。

2 个答案:

答案 0 :(得分:2)

如果要在STL集合中放置引用类型,则需要使用^表单。因此,您使用:boost::circular_buffer<PointerPoint^>代替boost::circular_buffer<PointerPoint>。 Windows :: Foundation :: Point是一种值类型,因此可以直接在集合中使用。

答案 1 :(得分:0)

我认为我在LocalPoint结构中使用Windows :: Foundation :: Point对象意外地找到了一个有效的解决方案。只需使用结构包装WinRT对象,然后运算符就可以正常工作,但它会增加一些语法噪音。

然而,我仍然在寻找一个更好的解决方案,但我会留在这里直到那时。