2016-05-21 6 views
0

Я хочу, чтобы удаленный процесс вызывал шаблон C++-функцию с помощью бережливости, поддерживает ли это помощь?Поддерживает ли поддерживающий IDL общие типы в C++?

Если да, то как я могу написать файл описания бережливости в этом случае?

+1

Функции шаблона не подлежат вызову. Это всего лишь способ вычеркнуть код. Вам нужно будет явно создать шаблонную функцию на C++ и затем экспортировать ее. –

+0

@RichardCritten, разумно, но при написании фреймворка с использованием экономии для использования rpc я хочу предоставить функциональность шаблона и предоставить им экземпляр для пользователей. – xunzhang

+0

Создание экземпляра шаблона происходит во время компиляции в C++. Поэтому трудно понять, как это будет работать. –

ответ

0

Шаблоны в C++ создаются с использованием типов во время компиляции, поэтому нет возможности предоставить пользователю MyOwnType во время выполнения. Это потребует некоторой странной перекомпиляции и перезагрузки частей кода во время выполнения кода ...

Так вот почему он обычно не поддерживается, чтобы предоставить пользователю возможность создавать шаблоны на стороне сервера.

Дальнейший режим - Thrift был разработан для поддержки межплатформенной связи. Представьте, что PHP-клиент пытается создать экземпляр некоторого C++-шаблона с классом, определенным в PHP ...

Также - пожалуйста, помните о проблемах безопасности - передайте любой код, который будет выполняться на стороне сервера (создание экземпляра на самом деле является формой выполнения кода) без проверка - всего лишь плохая идея.

В Thrift вы можете использовать общие vector или map для определения конкретных типов, но функции должны быть конкретными, а не универсальными.

Вы можете определить столько функций, сколько вам может понадобиться, со всеми типами, которые вы хотите поддерживать. Вы можете подумать даже о создании какого-либо скрипта, генерирующего Trrift 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); 

ИМХО: Это то, что кажется, что вы хотите создать «делать все» тип сервера, который редко хорошая идея - выберите то, что ваш сервер действительно имеет, чтобы сделать и сделать это хорошо.