C com 方法参数扣除
C++ COM+ method argument deduction
我在学习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明确指定。
相关文章:
- 使用在用于SFINAE的void_t中具有参数的方法
- 如何制作一个将函数作为参数的类方法
- c++方法参数只能在linux的发布模式下自行更改
- 使用用户定义的参数调用future/async并调用类方法
- 将成员函数指针作为参数传递给模板方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 具有字符串化的可变参数宏的现代/通用方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 如何在方法中传递结构参数
- 如何将类成员方法的参数列表自动填充写入可变参数?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- C++接口继承不同的参数方法
- C++ 模板:重载时找不到基类类型参数方法
- 如何使用迭代器作为参数方法?
- 具有不同亚型的参数方法
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 如何将 C 中声明的可选参数方法转换为 c++
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?