J'ai un tas de gabarits qui sont utilisés pour rpc et je me demandais s'il y avait un moyen de les simplifier car il se répète automatiquement. Je sais que varags pour les templates vient dans la prochaine norme mais pouvez-vous faire des valeurs par défaut pour les templates?simplifier les gabarits
Existe-t-il également un moyen de gérer les fonctions de retour vides comme des fonctions normales? Atm Je dois les séparer et les traiter comme deux choses différentes chaque fois en raison de modèles ne ramassant pas vide comme type.
template <typename R>
R functionCall(IPC::IPCClass* c, const char* name)
{
IPC::IPCParameterI* r = c->callFunction(name, false);
return handleReturn<R>(r);
}
template <typename R, typename A>
R functionCall(IPC::IPCClass* cl, const char* name, A a)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a));
return handleReturn<R>(r);
}
template <typename R, typename A, typename B>
R functionCall(IPC::IPCClass* cl, const char* name, A a, B b)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b));
return handleReturn<R>(r);
}
template <typename R, typename A, typename B, typename C>
R functionCall(IPC::IPCClass* cl, const char* name, A a, B b, C c)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c));
return handleReturn<R>(r);
}
template <typename R, typename A, typename B, typename C, typename D>
R functionCall(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d));
return handleReturn<R>(r);
}
template <typename R, typename A, typename B, typename C, typename D, typename E>
R functionCall(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e));
return handleReturn<R>(r);
}
template <typename R, typename A, typename B, typename C, typename D, typename E, typename F>
R functionCall(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e, F f)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e), IPC::getParameter(f));
return handleReturn<R>(r);
}
inline void functionCallV(IPC::IPCClass* cl, const char* name)
{
IPC::IPCParameterI* r = cl->callFunction(name, false);
handleReturnV(r);
}
template <typename A>
void functionCallV(IPC::IPCClass* cl, const char* name, A a)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a));
handleReturnV(r);
}
template <typename A, typename B>
void functionCallV(IPC::IPCClass* cl, const char* name, A a, B b)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b));
handleReturnV(r);
}
template <typename A, typename B, typename C>
void functionCallV(IPC::IPCClass* cl, const char* name, A a, B b, C c)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D>
void functionCallV(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D, typename E>
void functionCallV(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D, typename E, typename F>
void functionCallV(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e, F f)
{
IPC::IPCParameterI* r = cl->callFunction(name, false, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e), IPC::getParameter(f));
handleReturnV(r);
}
inline void functionCallAsync(IPC::IPCClass* cl, const char* name)
{
IPC::IPCParameterI* r = cl->callFunction(name, true);
handleReturnV(r);
}
template <typename A>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a));
handleReturnV(r);
}
template <typename A, typename B>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a, B b)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a), IPC::getParameter(b));
handleReturnV(r);
}
template <typename A, typename B, typename C>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a, B b, C c)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D, typename E>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e));
handleReturnV(r);
}
template <typename A, typename B, typename C, typename D, typename E, typename F>
void functionCallAsync(IPC::IPCClass* cl, const char* name, A a, B b, C c, D d, E e, F f)
{
IPC::IPCParameterI* r = cl->callFunction(name, true, IPC::getParameter(a), IPC::getParameter(b), IPC::getParameter(c), IPC::getParameter(d), IPC::getParameter(e), IPC::getParameter(f));
handleReturnV(r);
}
code supplémentaire comme demandé:
template <typename R>
R handleReturn(IPC::IPCParameterI* r)
{
if (r->getType() == PException::getTypeS())
{
gcException gce((gcException*)r->getValue());
safe_delete(r);
throw gce;
}
R temp = IPC::getParameterValue<R>(r, true);
safe_delete(r);
return temp;
}
inline void handleReturnV(IPC::IPCParameterI* r)
{
if (r->getType() == PException::getTypeS())
{
gcException gce((gcException*)r->getValue());
safe_delete(r);
throw gce;
}
safe_delete(r);
return;
}
Sans rapport avec votre question, mais qu'est-ce que 'safe_delete'? – GManNickG
juste un moyen de s'assurer que je supprime un pointeur et le définir à NULL. A également des surcharges pour différents types comme char * et vecteurs – Lodle
D'accord. :) Tant que vous ne vérifiez pas null avant de supprimer I "m heureux.: P (Suppression de null est un no-op, totalement sûr.) – GManNickG