C++ #define макрос со скобками?

Ваш вопрос довольно неясен. Является ли mChats Список, содержащий HomeScreenChatsHelper объектов? Я так полагаю. Если это так, то вы можете изменить цикл foreach на обычный цикл

//Assuming mChats is List e.g ArrayList
for (int i = 0; mChats.size(); i++){
            if (mChats.get(i).getID().equals(ID)) {
                mChats.remove(i);
                break;
            }
        }
8
задан Rolle 17 April 2009 в 10:11
поделиться

9 ответов

Вы можете сделать что-то очень близкое с помощью небольшого вспомогательного класса C ++.

class StartStopper {
public:
    StartStopper() { start(); }
    ~StartStopper() { stop(); }
};

Затем в своем коде:

{
    StartStopper ss;
    // code here
}

Когда выполнение входит в блок и создает переменную ss , вызывается функция start () . Когда выполнение покидает блок, деструктор StartStopper будет автоматически вызван и затем вызовет stop () .

41
ответ дан 5 December 2019 в 04:29
поделиться

Другие ответы хорошо затронули вопрос RAII, поэтому Я собираюсь рассмотреть его синтаксическую сторону .

#define startstop for(Starter s; s.loop; s.loop = false)
struct Starter {
    bool loop;
    Starter() { start(); loop = true; }
    ~Starter() { stop(); }
};

Используется как :

6
ответ дан 5 December 2019 в 04:29
поделиться

Идиоматический способ сделать это в C ++ называется Resource Acquisition Is Initialization , или коротко RAII. Помимо предоставления того, что вы хотите, он также имеет дополнительное преимущество, заключающееся в том, что он безопасен для исключений: будет вызываться функция stop , даже если ваш код вызывает исключение.

Определите структуру защиты:

struct startstop_guard
{
    startstop_guard()
    {
        start();
    }
    ~startstop_guard()
    {
        stop();
    }
};

а затем переписать свой код так:

{
    startstop_guard g;
    // your code
}

Страж

14
ответ дан 5 December 2019 в 04:29
поделиться
#define startstop(x, y, ...) for( /* use macro args */ )
4
ответ дан 5 December 2019 в 04:29
поделиться

Общее решение с RAII и boost :: function (std :: function).

class starter
{
    typedef boost::function< void () > action;
    action end_;
public:
    starter(action start, action end):
        end_(end)
    { 
        log("starter start");
        start(); 
    }
    ~starter()
    { 
        log("starter end");
        end_() ; 
    }
};
int main()
{
    {
        starter s(start, stop);
        middle();
    }

    return 0;
}

или для проверки и проверки идея

    void print(const std::string& message)
    {
        std::cout << message << std::endl;
    }
    int main()
    {
        starter s(boost::bind(print, "globalstart"),
                  boost::bind(print, "globalend")); 

        {
            starter s(boost::bind(print, "start"),
                      boost::bind(print, "end")); 
            std::cout << "middle" << std::endl;
        }
        return 0;
    }
2
ответ дан 5 December 2019 в 04:29
поделиться

Что вы пытаетесь сделать? Я бы порекомендовал проверить RAII как гораздо более ориентированный на C ++ способ ведения дел, чем макро-хакерство со всеми непредвиденными последствиями.

1
ответ дан 5 December 2019 в 04:29
поделиться

Не используйте макросы. Вместо этого вы можете использовать встроенные функции, поскольку они обеспечивают проверку типов и другие функции. Вы можете посмотреть здесь: встроенные функции

1
ответ дан 5 December 2019 в 04:29
поделиться

В c # вы можете использовать шаблон IDisposable и реализовать свою функцию Stop () в методе Dispose (), но это сработало бы, если бы вы использовали вариант .net c ++.

0
ответ дан 5 December 2019 в 04:29
поделиться

кредит dirkgently за идею... Я решил заполнить остальное

#define startstop() for(start();isStarted();stop())

1
ответ дан 5 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: