std :: function как аргумент std :: function - PullRequest
0 голосов
/ 22 февраля 2019

например, я могу сделать что-то вроде:

void foo(int i)
{
    std::cout << "fo is called with: " << i << "\n";
}

int main()
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

и вывод

fo вызывается с: 5

теперь я 'Мне любопытно, смогу ли я создать std :: function, которая получит std :: function в качестве аргумента, поэтому я думаю о такой функции, как:

void foAndFo(function<void(int)> foo)
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

, но это даже не может быть скомпилировано.

Теперь я изменил на что-то, может вызвать указатель на функцию.

using foType = void(*)(int);
void foAndFo(foType foo)
{
    std::function<void(int)> fo = std::bind(&foo, std::placeholders::_1);
    fo(5);
}

Теперь это может быть скомпилировано. Но теперь я не могу std :: bind это как:

int main()
{
std::function<foType> fo2 = std::bind(&foAndFo,std::placeholders::_1); //error
}

это такможно использовать std :: function в качестве аргумента std :: function?

1 Ответ

0 голосов
/ 22 февраля 2019

Это возможно.Просто опустите & перед foo здесь:

void foAndFo(function<void(int)> fo)
{
    std::function<void(int)> fo = std::bind(/*&*/foo, std::placeholders::_1);
    fo(5);
}

Разница в том, что если foo является void(int), то и foo, и &foo могут быть вставлены там, где функцияожидается.С другой стороны, если foo - это std::function, то два совершенно различны: foo можно передать для const std::function&, но &foo - это std::function*, указатель на объектвведите std::function.Последний не может быть вызван.

Минимальный рабочий пример:

#include <iostream>
#include <functional>

void foo(int i)
{
    std::cout << "fo is called with: " << i << "\n";
}

int main()
{
    std::function<void(int)> fo = std::bind(foo, std::placeholders::_1); // or &foo, both work
    std::function<void(int)> fo2 = std::bind(fo, std::placeholders::_1); // Error if &fo is used
    fo2(5);
}
...