Как получить альтернативное значение из функции, которая выдает требуемые данные через неконстантный выходной параметр для присвоения ей ссылки на константу?

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

void CClass::Function(const CArray<CItem*>* ItemsInput) const
{
/*
CArray<CItem*> Items;

if (ItemsInput != nullptr)
Items.Copy(*ItemsInput);
else
GetContainer().GetInnerItems(Items, NULL, true);
*/const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this] () -> const CArray<CItem*>
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return const_cast <const CArray<CItem*>& > (InnerItems);
}
;

//...
}

Некомментированный код — это максимальная степень, в которой я пытался использовать подход троичного оператора и лямбда-выражения, но до сих пор он был неудачным, выдавая ошибку:

1>Class.cpp(line of the last semicolon): error C2446: ':' : no conversion from '`anonymous-namespace'::<lambda2>' to 'const CArray<TYPE>'
1>          with
1>          [
1>              TYPE=CItem *
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Важные вещи, на которые стоит обратить внимание:

  • я пас this на лямбда-захвате, просто чтобы иметь доступ к GetInnerItems метод
  • GetInnerItems Метод дает внутренние элементы через свой первый параметр типа CArray<CItem*>&, который не является const и никогда не может быть const.

Поэтому, мне кажется, проблема в том, как GetInnerItems работает и не имеет ничего общего с троичным оператором. Предположим, я не могу изменить свою подпись, чтобы вернуть CArray, так как CArrayпроисходит от CObject который заявляет:

class AFX_NOVTABLE CObject
{
//...
private:
CObject(const CObject& objectSrc);              // no implementation
void operator=(const CObject& objectSrc);       // no implementation
//...
}

Итак, вопросы:

  • Как я могу присвоить альтернативное значение Ссылка к сопзЬ Items переменная с сохранением константности?

  • Если вы успешно ответили на первый вопрос, используя const_castМожете ли вы дать решение без него?

1

Решение

Я объявил лямбда-функцию, но забыл ее вызвать. Так, скобки необходимы. Поэтому обратите внимание на () после объявления с целью вызова к его исполнению:

const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this]() -> const CArray<CItem*>&
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return (InnerItems);
} ()
;

Сейчас компилируется нормально.

Но это приводит к новому вопросу: Лямбда не выводит автоматически тип возвращаемого значения

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector