pin_ptr使用reinterpret_cast或static_cast替代(void **)?

时间:2012-04-24 21:12:14

标签: c++-cli

是否有使用以下内容的替代方法?

class IGraphBuilder;

public ref class Device
{
private:
    IGraphBuilder* pGraphBuilder;

public:
    void Configure()
    {
        pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder;

        HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
            NULL,
            CLSCTX_INPROC,
            IID_IGraphBuilder, (void**)ppGraphBuilder);

reinterpret_cast(ppGraphBuilder)编译,但如果这种情况正确,我有点困惑。

如果这不是C ++ / CLI(其中&NativeMember实际上意味着interior_ptr<Type>(NativeMember)),我只会使用static_cast<void**>(&pGraphBuilder),但即使在正确转换为pin_ptr之后,也会使用pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder; static_cast<void**>(ppGraphBuilder) 编译

{{1}}

是否有任何解决方案或我被迫使用(void **)因为pin_ptr很奇怪?

1 个答案:

答案 0 :(得分:1)

reinterpret_cast(以及C演员)可能不行,尽管它可能因pin_ptr所谓的微不足道的布局而起作用。实际上,您必须先将转换运算符从cli::pin_ptr<IGraphBuilder*>调用到IGraphBuilder**(因此来自编译器的抱怨)。

reinterpret_cast<void**>(static_cast<IGraphBuilder**>(ppGraphBuilder))

是对的。您可能希望首先引入类型为IGraphBuilder**的中间变量:

pin_ptr<IGraphBuilder*> p = &pGraphBuilder;
IGraphBuilder** ppGraphBuilder = p;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
        NULL,
        CLSCTX_INPROC,
        IID_IGraphBuilder, reinterpret_cast<void**>(p));