J'ai un Visual Studio 2008 C++ DLL qui exporte une fonction qui accepte un paramètre variadique comme ceci:En utilisant métaprogrammation modèle pour envelopper des arguments variadique C style
__declspec(dllexport) void DLL_Foo(int count, ...)
{
va_list list;
va_start(list, count);
for(; count; --count)
{
const wchar_t* item = va_arg(list, const wchar_t*);
if(count % 2 == 0)
printfW(L"[%s] ", item);
else
printfW(L"%s ", item);
}
va_end(list);
printfW(L"\r\n");
}
L'utilisation attendue est quelque chose comme ceci:
DLL_Foo(4, L"int", L"1", L"const wchar_t*", L"Hello");
Lorsque la sortie serait:
[int] 1, [const wchar_t*] Hello
Pour simplifier l'utilisation de cette fonct ion, je l'intention d'inclure une fonction de modèle de C++ comme ceci:
template< class T1, class T2 >
void Foo(T1 p1, T2 p2)
{
std::wstringstream t1W;
t1W << typeid(p1).name();
std::wstringstream p1W;
p1W << p1;
std::wstringstream t2W;
t2W << typeid(p2).name();
std::wstringstream p2W;
p2W << p2;
::DLL_Foo(4, t1W.str().c_str(), p1W.str().c_str(), t2W.str().c_str(), p2W.str().c_str());
};
Lorsque l'utilisation prévue est comme ceci:
int a = 1;
const wchar_t* b = L"Hello";
Foo(a, b);
Avec le même résultat escompté comme précédemment.
Existe-t-il une méthode de récurrence de gabarit que je peux utiliser pour ne pas avoir à implémenter une autre fonction template<> Foo()
pour les paramètres 0..n?
template<> void Foo();
template< class T1 > void Foo(T1 p1);
template< class T1, ..., class N > void Foo(T1 p1, ..., N n);
S'il vous plaît, pas de solutions impliquant des modèles variadic ou d'autres fonctionnalités C++ 0x. Je réalise qu'ils sont merveilleux, mais j'utilise VS2008. Aussi, juste pour être plus difficile, je ne peux pas utiliser la fonctionnalité boost comme boost :: MPL.
Merci, PaulH
Edit: Oui, la fonction DLL dll réelle ne plus imprimer les informations de type et la valeur. La fonction DLL réelle ressemble un peu plus à ceci:
__declspec(dllexport) void DLL_Foo(MYHANDLE handle, int count, ...)
{
CMyObject* obj = reinterpret_cast< CMyObject* >(handle);
va_list list;
for(va_start(list, count); count; --count)
{
const wchar_t* item = va_arg(list, const wchar_t*);
if(count % 2 == 0)
{
obj->AddTypeInfo(item);
}
else
{
obj->AddValueInfo(item);
}
}
va_end(list);
}
Si c'est la source de la fonction, pourquoi ne pas l'utiliser et mettre la fonctionnalité dans Foo() vous-même? La moitié de la fonction est juste la gestion des arguments variables. – Puppy
@DeadMG - Ce n'est pas la fonction complète. DLL_Foo() traitera les informations et utilisera pour modifier l'état d'un objet qui est passé en tant que handle, puis le retourner comme un handle. Si ce n'est pas en contradiction avec votre suggestion, pouvez-vous en dire plus sur ce que vous voulez dire? – PaulH