легкое повышение:: связать

Для этого вам нужно будет использовать onSaveInstanceState () и onRestoreInstanceState () внутри действия. Передайте соответствующие пары значений ключа в onSaveInstanceState (), затем получите значения в onRestoreInstanceState (); Проверьте ссылку ниже для подробного объяснения и кода: [ https://stackoverflow.com/a/28262885/5985401] [1]

5
задан Dustin Getz 4 March 2010 в 21:49
поделиться

7 ответов

Я не знаком с boost:bind, но являюсь им что-то вроде этого?

#include <iostream>

void foo (int const& x) {
    std::cout << "x = " << x << std::endl;
}

void bar (std::string const& s) {
    std::cout << "s = " << s << std::endl;
}

template<class T>
void relay (void (*f)(T const&), T const& a) {
    f(a);
}

int main (int argc, char *argv[])
{
    std::string msg("Hello World!");
    relay (foo, 1138);
    relay (bar, msg);
}

Вывод-

x = 1138
s = Hello World!
2
ответ дан 18 December 2019 в 05:37
поделиться

Во-первых, я подвергаю сомнению Ваше утверждение, что это слишком тяжело для Вас для использования.

Во-вторых, шаблон самокрутки, если необходимо управлять поведением.

В-третьих, если Вы боитесь прокрутки Вашего собственного шаблона, я подвергаю сомнению Вашу способность судить это boost::bind слишком тяжело, чтобы Вы использовали.

17
ответ дан 18 December 2019 в 05:37
поделиться

Повышение. Функция улучшила производительность существенно приблизительно с 1,34 при использовании вместе с повышением:: связать. Если Вы представили со старой версией повышения, возможно, сделайте это снова с более свежим. boost::function получил способность сохранить небольшие функциональные объекты в маленьком буфере, выделенном на стеке, вместо на "куче" (использующий новое размещение).

См., что этот список рассылки обменивается сообщениями: http://lists.boost.org/Archives/boost/2006/01/98993.php.

2
ответ дан 18 December 2019 в 05:37
поделиться

Проверьте быстрого делегата Don Clugston. Это - предположительно, самый быстрый делегат, которого можно найти на актуальнейших платформах (компиляции вниз к 2 инструкциям по сборке.) Версия 1.4 + получает некоторое Повышение. Свяжите совместимость.

7
ответ дан 18 December 2019 в 05:37
поделиться

Общая идиома C++ должна использовать функторы (т.е. возражает что оператор переопределения ()). Дело в том, что Вы используете отдельный объект для инкапсуляции и кода, который будет призван обратно, и данные, на которые будет действовать тот код. Является ли функтор скрученным вручную, или сгенерированным повышением использования:: свяжите и/или <функциональный>, вероятно, не имейте большое значение ко времени выполнения наверху.

Таким образом вместо:

typedef void (*cb)(void*);
void funcThatNeedsCallback(cb thecallback, void *thedata) {
    // blah blah
    thecallback(thedata);
}

сделайте:

template<typename T>
void funcThatNeedsCallback(T &thefunctor) {
    // blah blah
    thefunctor();
}

Затем вызывающая сторона делает:

struct MyFunctor {
    int mydata1;
    char *mydata2;
    void operator()(void) {
        // do something with mydata1 and mydata2
    }
};

MyFunctor mf = { value1, value2 };
funcThatNeedsCallback(mf);

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

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

class CallbackInterface {
    virtual void theCallback(void) = 0;
    virtual ~CallbackInterface() {} // just in case
};

void funcThatNeedsCallback(CallbackInterface &cb) {
    // blah blah
    cb.theCallback();
}
2
ответ дан 18 December 2019 в 05:37
поделиться

Существует libsigc ++. Лицензия является LGPL, но реализация о какой Повышение. Сигнал делает (я читаю "слишком тяжелый", чтобы означать "устанавливать все Повышение, слишком тяжело" не, "Повышают. Сигнал является слишком медленным").

1
ответ дан 18 December 2019 в 05:37
поделиться

Люди, защищающие усиление :: СКОРОСТЬ СКОРОСТИ, вероятно, никогда не писали низкодержественные торговые системы или высокоскоростные графические библиотеки.
Boost - это хорошая библиотека общего назначения, а не оптимизирована скорость. Некоторые библиотеки повышения (по сравнению с настраиваемыми реализациями) могут быть довольно медленными в сравнении.

Для функций / делегатов см. В http://www.codeproject.com/kb/cpp/fastdelegate2.aspx для полезного сравнения.

Ciao.

1
ответ дан 18 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

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