CORBA: есть ли способ указать значение по умолчанию для аргумента операции в IDL?

У меня есть простой интерфейс CORBA с простой операцией, как показано в этом фрагменте IDL:

interface MtInterface
{
    void myOperation(in string id);
}

Мне нужно добавить логический аргумент в myOperation. Поэтому все, что я делаю, это меняю IDL на:

interface MtInterface
{
    void myOperation(in string id, in boolean flag);
}

Теперь это все хорошо, за исключением того, что этот интерфейс используется во многих местах, и я хотел бы избежать необходимости изменять все вызовы, задав значение по умолчанию: false в flagтак что моя первая попытка выглядит так:

interface MtInterface
{
    void myOperation(in string id, in boolean flag = false);
}

но это заставляет омниорба лаять Syntax error in operation parameters,

Итак, чтобы повторить вопрос в заголовке: есть ли способ указать значение по умолчанию для аргумента операции в целом в моем IDL? И в этом конкретном случае, как бы я указать значение по умолчанию false за flag?

Спасибо за вашу помощь!

2 ответа

Решение

Нет. IDL не поддерживает аргументы по умолчанию, возможно, потому что некоторые целевые языки не поддерживают эту функцию.

Что может работать для вас union как ваш аргумент. Один вариант имеет два параметра, один только один. Тем не менее, вам все равно придется вручную кодировать значение по умолчанию, например, если для версии с одним параметром вызовите версию с двумя параметрами, а для второго параметра будет установлено значение по умолчанию. С этим IDL:

interface MtInterface
{
   struct myShortArg
   {
      string    id;
   };

   struct myLongArg
   {
      string    id;
      boolean   flag;
   }

   union myArgument switch (unsigned short)
   {
      case 1: myShortArg   shortArg;
      case 2: myLongArg    longArg;
   }

   void myOperation(in myArgument);
}

В вашей реализации вам нужно будет проверить, каково фактическое содержание объединения (детали будут зависеть от языковой привязки). Что вы могли бы сделать в соответствии с:

switch(typeof(myArgument))
{
    case class(myLongArg):    myOperationImpl(myArgument.id, myArgument.flag);
                              break;

    case class(myShortArg):   myOperationImpl(myArgument.id, false);
                              break;
}
Другие вопросы по тегам