Учитывая набор функций, таких как:
template<class A1>
Void Go(A1 a);</p>
<p>template<class A1, class A2>
Void Go(A1 a1, A2 a2);</p>
<p>template<class A1, class A2, class A3>
Void Go(A1 a1, A2 a2, A3 a3);
Можно ли взять массив некоторого варианта типа и, учитывая его содержимое, запустить правильную функцию?Моя заявка на это заключается в том, что я хочу передать набор параметров X другому процессу, где у меня есть возможность передать только один указатель.Моя идея заключалась в том, чтобы отправить указатель на std :: vectorа затем каким-то образом решить, какой из вышеперечисленных методов запустить с учетом его содержимого.
Это касается моих экспериментов с многопоточными событиями и связью, поэтому это может показаться излишне эзотерическим!
Редактировать: хорошо, например, это намерениеОчевидно, что он не компилируется (разрешение шаблона происходит во время компиляции, но я хочу определить, какую функцию вызывать во время выполнения!):
#include <boost\any.hpp>
#include <vector>
#include <iostream>
#include <string>
class A
{
public:
void Go()
{
std::cout << L"(0 params)\n";
}
template
void Go(U0 u0)
{
std::cout << L"1 param " << u0 << L"\n";
}
template
void Go(U0 u0, U1 u1)
{
std::cout << L"2 params " << u0 << L" " << u1 << L"\n";
}
template
void Go(U0 u0, U1 u1, U2 u2)
{
std::cout << L"3 params " << u0 << L" " << u1 << L" " << u2 << L"\n";
}
};
class B
{
public:
void Whatever() {}
};
int main(int argc, wchar_t* argv[])
{
// Create a collection of variants.
std::vector<boost::any> myVariants;
B myB;
myVariants.push_back(123);
myVariants.push_back(std::wstring(L"Test"));
myVariants.push_back(&myB);
// Take a void pointer to them.
void *variants = &myVariants;
// Convert back into an array.
std::vector<boost::any>& myConverted = *(std::vector<boost::any> *)(variants);
// Fire the correct event on A.
A myA;
switch(myConverted.size())
{
case 0:
myA.Go();
break;
case 1:
myA.Go(myConverted[0]);
break;
case 2:
myA.Go(myConverted[0], myConverted[1]);
break;
case 3:
myA.Go(myConverted[0], myConverted[1], myConverted[2]);
break;
default: ;
// throw
}
}