C com 方法参数扣除

C++ COM+ method argument deduction

本文关键字:参数 方法 com      更新时间:2023-10-16

我在学习C 模板元编程方面遇到了一些麻烦。我正在尝试创建一些COM 包装器,以便我的生活与C 混合在一起:(

我的第一步是创建智能指针,该指针通过其Release方法管理COM 对象:

template <typename COM>
using com_ptr = std::shared_ptr<COM>;
template<class COM>
com_ptr<COM> make_com_ptr(COM **ppv)
{
    auto ret = com_ptr<COM>(*ppv, [](COM *p) { if (p) p->Release(); });
    *ppv = NULL;
    return ret;
}

到目前为止还不错,现在很棘手。(几乎(所有返回另一个com 对象的com 方法将返回上述接口,作为指向方法参数列表的指针的指针, HRESULT WINAPI IXMLDOMDocument::selectSingleNode(BSTR, IXMLDOMNode**)

我想/需要调用一些(成员(功能,这可能会给我带来结果指针作为其返回值,类似的函数:

IXMLDOMDocument *prawDoc(nullptr);
CoCreateInstance(..., reinterpret_cast<LPVOID*>(&prawDoc));
auto pDoc = make_com_ptr(&prawDoc);
com_ptr<IXMLDOMNode> pNode = FX(pDoc, &IXMLDOMDocument::selectSingleNode,_bstr_t("//xpath"));
^^(auto pNode = ...)         ^^ (the function)

现在,我到目前为止有什么:

template<typename COMRET, typename COM, typename METHOD, typename A1>
com_ptr<COMRET> _prv_com_comret(com_ptr<COM> This, const METHOD &Method, A1 Arg1)
{
    COMRET *ppv(nullptr);
    ::SetLastError((*This.*Method)(Arg1, &ppv));
    return make_com_ptr(&ppv);
}
#define com_comret( COM, This, Method, ... )
    _prv_com_comret<COM>( This, &decltype(This)::_Ptr_base::element_type::Method, __VA_ARGS__ )

所以,使用此模板功能和宏,我可以写下类似的东西:

auto pNode = com_comret(IXMLDOMNode, pDoc, selectSingleNode, _bstr_t("//xpath"));

令我感到困扰的解决方案是我必须指定返回类型(IXMLDOMNode(即使编译器确实知道其类型(每个人都同意,这是IXMLDOMDocument::selectSingleNode方法的最后一个参数(

因此,最终,这个长帖子缩短为:与某种模板Metaproggram Macro Sorcery 一起推断该参数类型而无需指定它吗?

预先感谢!

打开指针到会员类型,而不是使其不透明。

template<typename COMRET, typename COM, typename A1>
com_ptr<COMRET> _prv_com_comret(com_ptr<COM> This, COMRET (COM::* const Method)(A1, COMRET**), A1 Arg1)

这应该是可召唤的,没有模板ARGS明确指定。