Для одного класса я хочу сохранить несколько указателей на функции-члены одного класса в одном map
объекте хранения std::function
. Но я терплю неудачу в самом начале с этим кодом:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
Я получаю error C2064: term does not evaluate to a function taking 0 arguments
в xxcallobj
сочетании с некоторыми странными ошибками создания шаблона. В настоящее время я работаю на Windows 8 с Visual Studio 2010/2011 и на Win 7 с VS10 тоже не удается. Ошибка должна быть основана на некоторых странных правилах C ++, которым я не следую
std::function
, с дополнительным вthis
качестве первого параметра, напримерstd::function<void(Foo*, int, int)> = &Foo::doSomethingArgs
Либо вам нужно
так что вы можете вызвать его в любом случае, или вам нужно привязать конкретный экземпляр, например
this
источник
this
?Если вам нужно сохранить функцию-член без экземпляра класса, вы можете сделать что-то вроде этого:
Как бы выглядел тип хранилища без авто ? Что-то вроде этого:
Вы также можете передать эту функцию хранения стандартной привязке функции
Прошлые и будущие заметки: старый интерфейс std :: mem_func существовал, но с тех пор устарел. После C ++ 17 существует предложение сделать указатель на вызываемые функции-члены . Это будет приветствоваться.
источник
std::mem_fn
был удален; куча ненужных перегрузок была. С другой стороны, устарел с C ++ 11 и будет удален с C ++ 17.std::mem_fun
template<class R, class T> unspecified mem_fn(R T::*);
и он не уйдет.К сожалению, C ++ не позволяет вам напрямую получить вызываемый объект, ссылающийся на объект и одну из его функций-членов.
&Foo::doSomething
дает вам «указатель на функцию-член», которая ссылается на функцию-член, но не на связанный объект.Есть два способа обойти это, один из них -
std::bind
привязать «указатель на функцию-член» кthis
указателю. Другой - использовать лямбду, которая захватываетthis
указатель и вызывает функцию-член.Я бы предпочел последнее.
С g ++, по крайней мере, привязка функции-члена к этому приведет к объекту с тремя указателями в размере, а присвоение этому
std::function
приведет к динамическому распределению памяти.С другой стороны, лямбда, которая захватывает,
this
имеет только один указатель размера, назначая егоstd::function
не приведет к динамическому выделению памяти с помощью g ++.Хотя я не проверял это с другими компиляторами, я подозреваю, что аналогичные результаты будут найдены там.
источник
Вы можете использовать функторы, если вы хотите менее общий и более точный контроль под капотом. Пример с моим Win32 API для пересылки сообщения API из одного класса в другой.
IListener.h
Listener.h
Dispatcher.h
Принципы использования
Удачи и спасибо всем за обмен знаниями.
источник
Вы можете избежать
std::bind
этого:источник