thrift IDL是否支持C ++中的泛型类型?

时间:2016-05-21 13:11:50

标签: c++ c++11 rpc thrift idl

我想使用thrift远程进程调用模板C ++函数,是否支持thrift?

如果是的话,在这种情况下如何编写一份节俭描述文件?

1 个答案:

答案 0 :(得分:0)

C ++中的模板在编译时使用类型进行实例化,因此无法允许用户在运行时提供MyOwnType。在代码执行期间需要进行一些奇怪的重新编译和重新加载代码......

因此,通常不支持为用户提供在服务器端实例化模板的可能性。

进一步模式 - Thrift旨在支持跨平台通信。想象一下,PHP客户端尝试使用PHP中定义的类来实例化一些C ++模板...

另外 - 请记住安全问题 - 传递任何代码在服务器端执行(模板实例化实际上是代码执行的形式),而不进行验证只是一个坏主意。

在Thrift中,您可以使用通用vectormap来定义特定类型,但函数需要是特定的,而不是通用的。

您可以使用您想要支持的所有类型定义尽可能多的功能。您甚至可以考虑从您想要支持的类型列表中创建一些生成Thrift IDL的脚本。

或者您可以使用Thrift union类型或optional字段来创建“变体”类型:

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

void genericFun(1: Arg a);

恕我直言:看起来你想创建“做所有事情”类型的服务器,这很少是一个好主意 - 选择你的服务器 做什么做得好。