次のような一連の関数が与えられます。
template<class A1>
Void Go(A1 a);
template<class A1, class A2>
Void Go(A1 a1, A2 a2);
template<class A1, class A2, class A3>
Void Go(A1 a1, A2 a2, A3 a3);
いくつかのバリアント型の配列を取得し、その内容を指定して、正しい関数を起動することは可能ですか?このための私のアプリケーションは、パラメーターXのセットを別のプロセスに渡したいというものです。このプロセスでは、単一のポインターを渡すオプションしかありません。私のアイデアは、std :: vector <boost :: any>へのポインターを送信し、その内容を指定して上記のメソッドのどれを起動するかを何らかの方法で解決することでした。
これは、クロススレッドのイベントと通信に関する私の実験に関係しているため、不必要に難解に見えるかもしれません。
編集:わかりました、たとえば、これは意図です。明らかにコンパイルされません(テンプレートの解決はコンパイル時に行われますが、実行時に呼び出す関数を決定したいです!):
#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
}
}