このパズルには何週間も費やしてきましたが、ここではC++バリデーションテンプレートの群衆への挑戦として提供するかもしれないと考えました。それができれば、私はあなたに約10秒でどのように表示されるのかと賭けるでしょう。C++ - 17バリデーションテンプレート:コールバック引数の戻り値の型と引数の型の両方を取得します
私はC++で関数のコレクションを持っていますが、それぞれ独自の戻り型(またはvoid)を持ち、それぞれ独自の引数型を持っています。簡単にするため、などのクラス、引数の変数番号にPODの引数とポインタのミックスので、2つの例:
int somefunc(int x, double d) { return x + (int)d; }
void otherfunc(Foo *a, Bar *b, int x) { ... }
私の目標は、キャプチャ可変引数の関数を構築することにより、注釈なしで静的なコンパイル時の反射を行うことですここでは完全な型のセットです。議論のために、私たちの関数はRT f(T1 a、T2 b、...)型であると言うことができます。私のコンテキストは、RPCとマルチキャストシステムのための新しい(そしてはるかに優れた)データマーシャリングレイヤを構築していることです。これらのコールバックは実際にはバイト配列の受信時に行われます。適切な型:バイト配列の最初のバイトから抽出されたint、またはFoo自身が持ち上げを行うファクトリメソッドを持つ新しいFoo(char *)
静的な反射は何を意味しますか?私はconst std :: listを必要とします。ここでは、typeid(RT).hash_code()をInfoクラスに入れたり、引数のカテゴリごとにコンストラクタへのポインタを設定したりします(PODコンストラクタは基本的にint *に入ってくるバイトシーケンスを返し、intを返します;クラスコンストラクタはファクトリメソッドを呼び出します)。
OK、長いプリアンブル、失敗した試行:これは私の試行です。 C++ 17では、RTが正しくバインドされているように見えますが、Restはバインドできません。なぜなら、Restは実際にRTがキャプチャする関数型全体の引数型のリストなのかもしれないからです。何か案は?
class Info
{
int rt, at; Info *next;
Info(int r, int a, Info* nxt) { rt = r; at = a; next = nxt; }
};
template<typename RT>
Info *Scan(RT cb())
{
return nullptr;
}
template<typename RT, typename T, typename Rest...> Info* Scan(RT cb(T x, Rest... args))
{
return new Info(typeid(RT).hash_code(), typeid(T).hash_code(), Scan<RT, Rest...>(cb(args...));
};
int TestMethod(int x, int y)
{
return 0;
}
int main()
{
Scan(TestMethod);
return 0;
}
'template' < - '〜'は* Rest *の前にあるべきです。あなたがしたいことは、C++ 11で実行可能で、atmで作業しています。 –
coyotte508