C++将成员函数用作可调用对象

成员函数指针与普通函数指针不同,它必须绑定到特定的对象上才能使用,所以成员函数指针不是一个可调用对象,下面介绍三种方法从成员函数指针获取可调用对象。

function

function既可以从普通函数生成一个可调用对象,也可以从成员函数生成一个可调用对象,如果是成员函数,则第一个形参必须表示该成员是在哪个对象上执行的,同时我们提供给function的形式中还必须指明对象是否是以指针或引用的形式传入的。

#include 

class Person
{
public:
    const std::string name="1234";
    bool testFunc(int height) const
    {
        std::cout << height << std::endl;
        return true;
    };
};

int printAddValue(int a, int b)
{
    int ret = a + b;
    std::cout << ret << std::endl;
    return ret;
}


int main(void)
{
    //将普通函数作为可调用对象
    std::function func1=printAddValue;
    func1(1,2);
    
    //成员函数作为可调用对象
    std::function func2= &Person::testFunc;
    func2(Person(),10);
    system("pause");
    return 0;
}

mem_fn

和function不同,mem_fn可以根据成员指针的类型推断可调用对象的类型,而无需用户显示指定,并且mem_fn生成的可调用对象可以通过对象调用,也可以通过指针调用。

#include 

class Person
{
public:
    const std::string name="1234";
    bool testFunc(int height) const
    {
        std::cout << height << std::endl;
        return true;
    };
};


int main(void)
{
    auto func1 = std::mem_fn(&Person::testFunc);
    func1(Person(), 10);
    func1(new Person(), 10);
    system("pause");
    return 0;
}

bind

与function类似,bind既支持普通函数也支持成员函数,用于成员函数时必须将函数中用于表示执行对象的形参转换为显式的;和mem_fn类似,bind生成的可调用对象的第一个实参即可以是指针也可以是引用。

class Person
{
public:
    const std::string name="1234";
    bool testFunc(int height) const
    {
        std::cout << height << std::endl;
        return true;
    };
};


int main(void)
{
    auto func1 = std::bind(&Person::testFunc, std::placeholders::_1, std::placeholders::_2);
    func1(Person(), 10);
    func1(new Person(), 10);
    system("pause");
    return 0;
}

你可能感兴趣的:(C++将成员函数用作可调用对象)