2016-05-21 7 views
0

私はテンプレートを使用してC++の関数を呼び出すリモート処理を行いたいですが、これをサポートするのが倹約ですか?IDLは、C++でジェネリック型をサポートしていますか?

それがない場合は、どのように私はこのケースで倹約記述ファイルを書き込むことができますか? C++での

+1

テンプレート関数は呼び出し可能ではありません。それらはコードを打ち抜く方法です。 C++でテンプレート関数を明示的にインスタンス化し、エクスポートする必要があります。 –

+0

@RichardCritten、合理的ですが、rpcの使用のために倹約を使用してフレームワークを書く際に、テンプレート機能を提供し、ユーザーにインスタンス化を行いたいと思います。 – xunzhang

+0

テンプレートのインスタンス化は、C++のコンパイル時に行われます。だから、これがどのように機能するかは分かりません。 –

答えて

0

テンプレートは、コンパイル時に型をインスタンス化するので、実行時にMyOwnTypeを提供するために、ユーザーを許可する方法はありませんされています。それは通常、サーバー側でテンプレートをインスタンス化する可能性をユーザに提供するためにサポートされていないだから、なぜだ...

をコード実行時のコードの部分のいくつかの奇妙な再コンパイルと再読み込みが必要になります。

またモード - 倹約は、クロスプラットフォームの通信をサポートするように設計しました。 PHPクライアントがPHPで定義されたクラスでいくつかのC++テンプレートをインスタンス化しようとしていると想像してみてください。

また、セキュリティ上の問題については、サーバーサイドで実行されるコードを渡してください(テンプレートインスタンス化は実際にはコード実行の検証は単なる悪い考えです。

Thriftでは、汎用のvectorまたはmapを使用して特定のタイプを定義できますが、機能は汎用ではなく特定のものである必要があります。

あなたがサポートするすべてのタイプの必要があるかもしれませんなだけの機能を定義することができます。サポートしたいタイプのリストからThrift IDLを生成するスクリプトを作成することも考えられます。

または作成するスリフトunionタイプやoptionalフィールドを使用することができ、「バリアント」タイプ:

union Arg { 
    1: optional Type1 t1; // not sure if union works well enough... 
    2: optional Type2 t2; 
} 

void genericFun(1: Arg a); 

私見:それは、サーバーの「行うすべて」タイプを作成したいように思える、めったにありません良いアイデア - あなたのサーバーが実際に何を選択は、よく行うためにを持っています。

関連する問題