Почему я могу сохранить вызываемую цель в std :: function, которая не соответствует типу - PullRequest
2 голосов
/ 10 июля 2019

Я пробовал следующее:

typedef std::function<void(int)> callback;

struct testclass
{
    void testfunc()
    {
        printf("test\n");
    }
};

int main()
{
    testclass test;
    callback c = std::bind(&testclass::testfunc, &test);
    c(1);
}

Вывод

test

std::bind возвращает вызываемую цель, такую ​​как void(void), в то время как обратный вызов должен быть сохраненvoid(int).

Почему я могу это сделать?

1 Ответ

1 голос
/ 10 июля 2019

std::bind возвращает вам функциональный объект, который игнорирует любой аргумент, не имеющий связанного заполнителя. Это свободная спичка.

Например:

auto f = []{}; // no arguments, do nothing
f(1); // obviously ill-formed

auto g = std::bind(f);
g(); // okay, calls f()
g(1); // okay, calls f()
g(1, 2); // okay, calls f()

В вашем примере у вас есть function<void(int)>, который вы инициализируете результатом вызова std::bind() без заполнителей. Это отлично работает. Аргумент int function просто игнорируется. Это может или не может быть то, что вы на самом деле хотите сделать, но это совершенно правильный код.

<ч />

С лямбдой вы можете получить тот же эффект, написав:

callback c = [&test](int){ test.testfunc(); };

Здесь мы должны явно указать параметр, тогда как с bind он неявно игнорировался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...