您可以将模板应用于C ++ CX中的ref类,您可以将它们应用于普通类。显然,您不能将模板应用于委托并引用它,以便编译器将根据需要多次实现该模板。您可以尝试在ref类中定义模板委托,但是您不能将其公开,甚至不能将其公之于众。但是,您可以引用本机类中的委托实例。例如。您可以接受C ++ CX委托作为本机类的参数,您可以将其作为引用,但不能在类本身中定义类型。
有没有人知道如何让一个可变参数模板本机类使用并保存一个WinRT / UWP委托,该委托匹配模板的返回类型和可变参数?
此模板将完全编译为Windows运行时组件,只需在内部使用。
答案 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...);
}
然后,您可以在本机类模板中使用它来接受可变参数委托参数。