Использование общих объектов 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 тоже не получается. Ошибка должна основываться на некоторых странных правилах С++, которые я не соблюдаю.

EDIT: я использую boost НЕ. Это С++ 11, встроенный в компилятор MS.

112
28 сент. '11 в 14:30
источник поделиться
3 ответов

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

Поскольку ваша подпись 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);

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

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

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

200
28 сент. '11 в 14:32
источник

Связанные вопросы


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

Вам нужно

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

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

std::function<void(void)> f = std::bind(&Foo::doSomething, this);
57
28 сент. '11 в 14:32
источник

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

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 существует, но с тех пор устарел. Существует предложение, post С++ 17, чтобы сделать указатель на функции-члены вызываемыми. Это было бы очень приятно.

5
03 нояб. '16 в 7:57
источник

Посмотрите другие вопросы по меткам или Задайте вопрос