Использование универсальных объектов std:: function с функциями-членами в одном классе



для одного класса я хочу сохранить некоторые указатели на функции-члены одного класса в одном 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++, которые я не соблюдаю.



изменить: Я делаю не используйте boost. Это c++11, интегрированных в компилятор МС.

719   3  

3 ответов:

нестатическая функция-член должна вызываться с объектом. То есть, он всегда неявно передает "этот" указатель в качестве своего аргумента.

потому что std::function подпись указывает, что функция не принимает никаких аргументов (<void(void)>), вы должны связать первый (и единственный) аргумент.

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

если вы хотите связать функцию с параметрами, вам нужно указать заполнители:

using namespace std::placeholders;
std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);

или, если ваш компилятор поддерживает C++11 лямбда:

std::function<void(int,int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
}

(у меня нет компилятора с поддержкой C++11 под рукой прямо сейчас, так что я не могу проверить это.)

либо нужно

std::function<void(Foo*)> f = &Foo::doSomething;

Так что вы можете вызвать его на любом экземпляре, или вам нужно привязать конкретный экземпляр, например this

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

Если вам нужно сохранить функцию-член без экземпляр класса, вы можете сделать что-то вроде этого:

class MyClass
{
public:
    void MemberFunc(int value)
    {
      //do something
    }
};

// Store member function binding
auto callable = std::mem_fn(&MyClass::MemberFunc);

// Call with late supplied 'this'
MyClass myInst;
callable(&myInst, 123);

как бы выглядел тип хранения без авто? Что-то вроде этого:

std::_Mem_fn_wrap<void,void (__cdecl TestA::*)(int),TestA,int> callable

вы также можете передать эту функцию хранения в стандартную функцию привязки

std::function<void(int)> binding = std::bind(callable, &testA, std::placeholders::_1);
binding(123); // Call

прошлые и будущие заметки: более старый интерфейс std:: mem_func существовал, но с тех пор был осужден. Предложение существует, сообщение C++17, чтобы сделать указатель на вызываемые функции-члены. Это было бы очень кстати.

Comments

    Ничего не найдено.