Код с комментариями работает, но он не является справочным, поэтому он требует больших вычислительных затрат.
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
Можете ли вы дать решение без него?
Я объявил лямбда-функцию, но забыл ее вызвать. Так, скобки необходимы. Поэтому обратите внимание на () после объявления с целью вызова к его исполнению:
const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this]() -> const CArray<CItem*>&
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return (InnerItems);
} ()
;
Сейчас компилируется нормально.
Но это приводит к новому вопросу: Лямбда не выводит автоматически тип возвращаемого значения