C ++ CX中的Variadic模板化委托,用于非托管可变参数模板类

时间:2015-11-26 15:09:02

标签: templates delegates interop uwp c++-cx

您可以将模板应用于C ++ CX中的ref类,您可以将它们应用于普通类。显然,您不能将模板应用于委托并引用它,以便编译器将根据需要多次实现该模板。您可以尝试在ref类中定义模板委托,但是您不能将其公开,甚至不能将其公之于众。但是,您可以引用本机类中的委托实例。例如。您可以接受C ++ CX委托作为本机类的参数,您可以将其作为引用,但不能在类本身中定义类型。

有没有人知道如何让一个可变参数模板本机类使用并保存一个WinRT / UWP委托,该委托匹配模板的返回类型和可变参数?

此模板将完全编译为Windows运行时组件,只需在内部使用。

1 个答案:

答案 0 :(得分:0)

我发现无法使用带有委托的可变参数模板。但是,我确实发现你可以简单地在ref类上调用标准的成员函数指针 - 我曾经有过,错误的,有些“假设”我无法做到,因为我不相信你可以在没有编组的情况下在C ++ / CLI中做到这一点(我仍然通过我的“编程”得到它,尽管语法相似,但这些是完全不同的平台。)

如果有人需要C ++ CX的可变“委托”,欢迎使用此代码(不是特别复杂)...无论如何都不能在运行时组件中导出泛型/模板,所以它不像你将会出现装配类问题。

template<typename MemberTyp, typename ReturnTyp, typename ...ParamTyps>
private ref class UWPDelegate
{       
public:
    typedef ReturnTyp(MemberTyp::*myFPTyp)(ParamTyps...);
private:        
    myFPTyp fp;
    MemberTyp ^instance;

internal:
    UWPDelegate(MemberTyp^ targetObject, myFPTyp targetMethod);

    ReturnTyp operator()(ParamTyps... args);

};

template<typename MemberTyp, typename ReturnTyp, typename ...ParamTyps>
inline UWPDelegate<MemberTyp, ReturnTyp, ParamTyps...>::UWPDelegate(MemberTyp ^ targetObject, myFPTyp targetMethod)
{
    fp = targetMethod;
    instance = targetObject;
}

template<typename MemberTyp, typename ReturnTyp, typename ...ParamTyps>
inline ReturnTyp UWPDelegate<MemberTyp, ReturnTyp, ParamTyps...>::operator()(ParamTyps ...args)
{
    return (instance->*fp)(args...);
}

然后,您可以在本机类模板中使用它来接受可变参数委托参数。