2015-11-26 1 views
0

Вы можете применить шаблоны для ref классов в C++ CX, вы можете применить их к обычным классам. Вы не можете, по-видимому, применить шаблон к делегату и ссылаться на него так, чтобы компилятор реализовал это столько раз, сколько необходимо. Вы можете попытаться определить делегата шаблона в классе ref, но тогда вы не можете сделать его общедоступным или даже внутренним, что победит цель. Однако вы можете иметь ссылку на экземпляр делегата в родном классе. Например. вы можете принять делегат C++ CX в качестве аргумента для родного класса, и вы можете использовать его как ссылку, но вы не можете определить тип в самом классе.Variadic templated delegate в C++ CX для использования в не управляемом классе вариационных шаблонов

Кто-нибудь имеет представление о том, как я могу использовать собственный класс с переменным шаблоном и содержать делегат WinRT/UWP, который соответствует типу возврата и вариационным параметрам шаблона?

Этот шаблон будет полностью скомпилирован в компонент времени выполнения Windows и должен использоваться только внутри него.

ответ

0

Я не нашел возможности использовать вариационный шаблон с делегатом. Тем не менее, я обнаружил, что вы можете просто вызвать стандартные указатели на функции в классах ref - что-то, что у меня было, ложно, несколько «предполагается», которое невозможно было сделать, поскольку я не думаю, что вы могли бы это сделать в C++/CLI без маршалинга (Я все еще получаю это через свое «программирование», что это совершенно разные платформы, несмотря на синтаксическое сходство.)

Если кому-то нужен переменный «делегат» для C++ CX, вы можете использовать этот код (не это особенно сложный) ... В любом случае вы не можете экспортировать generics/templates в компоненты времени выполнения, поэтому не похоже, что у вас возникнут проблемы с типом сборки.

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...); 
} 

Затем вы можете использовать это в шаблоне родного класса, чтобы принимать аргументы делегата Variadic.