LINUX.ORG.RU

Возврат старого значения переменной

 ,


0

4

Есть класс некоторое подобие смартпоинтера, у него есть метод detachObject который возвращает указатель на объект и отсоединяет смартпоинтер от этого объекта. Простейшая реализация в 3 строчки:

Object* detachObject()
{
  Object *tmpVar = m_obj;
  m_obj = NULL;
  return tmpVar;
}

Можно ли переписать в одну строку и без использования tmpVar ?

PS. Понятно что профита это никакого не даст (компилятор и так все проаптимизирует и tmpVar выбросит) - но есть чисто «спортивный» интерес можно ли обойтись в єтом методе без tmpVar ?

★★★★

int global = 0;

int v()
{
  auto u = std::unique_ptr <void, std::function <void(void *)> > ((void*)1, [] (void *) {global = 1;});
  return global;
}
anonymous
()

без использования tmpVar ?

Нет.

/thread

Deleted
()

Если надо делать часто - то можно извратится, а из коробки видимо нет.

pon4ik ★★★★★
()
Ответ на: комментарий от anonymous

Беда С++ - не только возможность задать такой вопрос, но и получить на него одобряемый большой частью программистов ответ.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
try {return m_obj;}
finally {m_obj = NULL;}

Да, ванильные плюсы так не умеют. Однако гугл выдает, что тот же MSVS15 что-то подобное поддерживает

Crocodoom ★★★★★
()
Ответ на: комментарий от Kroz

специализировать swap для возвращения нужного агрумента, вынести в <swap> или <utils>, место в памяти все-равно будет выделено, на регистрах или где-то еще, не важно (forEach это без for потому ЛУЧЕЕе, - не стоит заблуждаться, явное лучше неявного, простое лучше сложного, очевидное ...)

anonymous
()
Ответ на: комментарий от Deleted

Да тут советчики понаписывали :) Мне хотелось бы увидеть чтото типа

return (m_obj=NULL,m_obj);
или
return (m_obj,m_obj=NULL);
Но как заставить оператор "," вычислять с право на лево или возвращать левый аргумент - непонятно

zaz ★★★★
() автор топика
Ответ на: комментарий от anonymous

специализировать swap для возвращения нужного агрумента

У него там указатель; что специфицировать?

Kroz ★★★★★
()
Ответ на: комментарий от zaz

Да тут советчики понаписывали :)

Что тебе не нравится?

Мне хотелось бы увидеть чтото типа

Не увидишь. В C++ и так полно нечитабельного сахара, ещё один никому не нужен.

Но как заставить оператор "," вычислять с право на лево

Я фигею просто. Тебе комитет дал exchange - пользуйся! Нет, не хочу exchange, хочу запятую справа налево вычислять.

Esper
()
Ответ на: комментарий от Deleted

только это не беда С++. это беда современного образования, или конкретных авторов на ЛОРе.

я после прочтения кода получила моральную травму. вот как теперь это развидеть?

Iron_Bug ★★★★★
()
Ответ на: комментарий от zaz
  return (T[]){m_obj, m_obj = nullptr}[0]

В дефолтных днищекрестах можешь заюзать array, но это будет через жопу, либо жди пока завезут array{}.

anonymous
()
Ответ на: комментарий от zaz

условный псевдокод

const tap = (&data, action) => {
  const value = data.copy()
  action(&data)
  return &value
}

return tap(&object, data => data = null)

без утилиты не обойтись никак, не стоит ждать сахара от горького языка

anonymous
()
Ответ на: комментарий от zaz

ну так return copy(object), (object = nullptr) не сработает разве? и вообще, зачем тебе этот = null не ясно, можешь напомнить, а то лень перечитывать? чего ты добиться пытаешься, скрыть за ширмой лишнюю строку? все-равно внутри она будет, и от этой мысли никак не избавишься.

anonymous
()
Ответ на: комментарий от Iron_Bug

Чтобы не получать моральных травм, просто не нужно заходить туда, где в тегах есть «С++», «phyton» и прочее дерьмо.

anonymous
()
Ответ на: комментарий от anonymous

без утилиты не обойтись никак

Обойтись.

template <typename T, typename F> T tap(T& data, const F& action) {
    const auto value = data;
    action(data);
    return value;
}

return tap(object, [](auto& data) { data = nullptr; });

или даже

template <typename T, typename F> T tap(T& data, const F& action) {
    const auto value = data;
    action();
    return value;
}

return tap(object, [&] { object = nullptr; });

Просто это никому не надо - 99% нужды в побочных эффектах после возврата значения покрывается постинкрементом и тем же std::exchange.

Esper
()
Ответ на: комментарий от anonymous

пистон, естессна, не нужен. но чем же плох С++? я иногда даже отвечаю на вопросы, если они адекватные. и даже пару раз тут попадались весьма интересные вопросы и серьёзные дискуссии.

только вот троллей развелось много в последнее время.

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

от того, что аффтар кода не читал ни единого пособия для нубов по С или С++. иначе бы он такое не написал. тут даже комментировать бесполезно, потому что это не код, а одна сплошная грубая ошибка.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

Непортабельно² (gcc/clang/icc-only, может не работать за пределами x86)

return __sync_lock_test_and_set(&m_obj, NULL);
/thread

kawaii_neko ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.