bind()适配器(Adapter) -- 调用全局函数及成员函数

调用全局函数

调用全局函数程序实例:

#include <iostream>
#include <algorithm>
#include <functional>
#include <locale>
#include <string>

using namespace std;
using namespace std::placeholders;

char my_toupper(char c)
{
    locale loc;
    return std::use_facet<std::ctype<char> >(loc).toupper(c);
}

int main()
{
    string s("Internationalization");
    string sub("Nation");

    string::iterator pos;
    pos = search
        (
        s.begin(), s.end(),
        sub.begin(), sub.end(),
        bind
        (
        equal_to<char>(),
        bind(my_toupper, _1),
        bind(my_toupper, _2)
        )
        );
    if (pos != s.end())
    {
        cout << "\"" << sub << "\" is part of\"" << s << "\""
            << endl;
    }

    system("pause");
}
运行结果:
"Nation" is part of"Internationalization"
请按任意键继续. . .


程序分析:

本例采用search()算法检验sub是否为s的一个子字符串,大小写不计。有了以下:

bind(equal_to<char>(),bind(my_toupper, _1),bind(my_toupper, _2))

便是建立一个function object 并相当于调用:

my_toupper(arg1) == my_toupper(arg2);

注意:

bind()内部会复制被传入的实参。

若要改变这种行为,让function object使用一个引用(reference)指向被传入的实参,可利用ref()或cref():

例如:

void incr(int& i)
{
    ++i;
}
int i =0;
bind(incr, i)();      //仅仅一个拷贝
bind(incr, ref(i))(); //引用传递

调用成员函数

以下程序示范bind()如何被用来调用成员函数

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;
using namespace std::placeholders;

class Person
{
private:
    string name_;
public:
    Person(const string& n)
        : name_(n)
    {}

    void print() const
    {
        cout << name_ << endl;
    }

    void print2(const string& prefix) const
    {
        cout << prefix << name_ << endl;
    }
};

int main()
{
    vector<Person> coll =
    {
        Person("csu"),
        Person("csru"),
        Person("csiu")
    };

    //每个person对象调用成员函数
    for_each(coll.begin(), coll.end(), bind(&Person::print, _1));
    cout << endl;

    for_each(coll.begin(), coll.end(), bind(&Person::print2, _1, "Person: "));
    cout << endl;

    bind(&Person::print2, _1, "This is : ")(Person("铁道学院"));

    system("pause");
}
/*
运行结果
csu
csru
csiu

Person: csu
Person: csru
Person: csiu

This is : 铁道学院
请按任意键继续. . .
*/


程序分析:

程序中的bind(&Person::print, _1)定义一个function object,其内针对传入的Person调用param1.print(),

也就是说,由于第一实参是个成员函数,下一个参数将定义“用以调用成员函数”的对象。

其他任何实参都会被传递给该成员函数。这意味着:

bind(&Person::print2, _1, "Person: ")

定义出一个function object,其内针对传入Person调用param1.print2("Person:")


Lambda实现调用全局函数及类成员函数

//全局函数
#include <iostream>
#include <algorithm>
#include <locale>
#include <string>

using namespace std;

char my_toupper(char c)
{
    std::locale loc;
    return std::use_facet<std::ctype<char>>(loc).toupper(c);
}

int main()
{
    string s("Internationalizition");
    string sub("Nation");

    string::iterator pos;
    pos = search(s.begin(), s.end(),
        sub.begin(), sub.end(),
        [](char c1, char c2){
        return my_toupper(c1) == my_toupper(c2);
        }
    );

    if (pos != s.end())
    {
        cout << sub << " is part of " << s << endl;
    }

    system("pause");
}
/*
Nation is part of Internationalizition
请按任意键继续. . .
*/

//类成员函数
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;
using namespace std::placeholders;

class Person
{
private:
    string name_;
public:
    Person(const string& n)
        : name_(n)
    {}

    void print() const
    {
        cout << name_ << endl;
    }

    void print2(const string& str) const
    {
        cout << str << name_ << endl;
    }
};

int main()
{
    vector<Person> coll =
    {
        Person("csu"),
        Person("csru"),
        Person("csiu")
    };

    for_each(coll.begin(), coll.end(),
        [](const Person& p){
        p.print();
    });
    cout << endl;

    for_each(coll.begin(), coll.end(),
        [](const Person& p){
        p.print2("Person: ");
        });

    system("pause");
}
/*
csu
csru
csiu

Person: csu
Person: csru
Person: csiu
请按任意键继续. . .

*/
时间: 2024-10-08 02:38:27

bind()适配器(Adapter) -- 调用全局函数及成员函数的相关文章

为什么通过空指针(NULL)能够正确调用类的部分成员函数

#include <iostream> using namespace std; class B { public: void foo() { cout << "B foo " << endl; } void pp() { cout << "B pp" << endl; } void FunctionB() { cout << "funB" << endl; }

C++调用空指针对象的成员函数——静态绑定与动态绑定

最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题: C++类的成员函数存储方式(是否属于类的对象) 两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点. 一个简单的例子: class MyClass { public: int i; void hello() { printf("hello\n"); } void print() { printf("%d\n", i); } }; void main() { MyCl

为什么通过空指针(NULL)可以正确调用类的部分成员函数

#include <iostream> using namespace std; class B { public: void foo() { cout << "B foo " << endl; } void pp() { cout << "B pp" << endl; } void FunctionB() { cout << "funB" << endl; }

golang写业务代码,用全局函数还是成员函数

在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复用的代码都会封装为功能函数了.在写业务代码的时候,使用包+全局函数的划分方式,可以将业务代码写成单例,把receive也省略掉了,简单清晰. 使用包+全局函数的方式来划分模块,很多项目在写业务代码的时候,都是这样操作的,但这样会增加目录的层次,看起来会比较啰嗦. 因为使用包划分代码,业务代码使用的变

c++语言友元函数和成员函数对运算符重载

#include<iostream> using namespace std; /******************************************/ /*use member function to overload operator*/ /******************************************/ class RMB{ public: RMB(unsigned int d, unsigned int c); RMB operator + (RM

面向对象,全局函数和成员函数之间的转换

class A{private: int a; int b;public: A(int a, int b) {  this->a = a;  this->b = b; } A Test(A &aa) {  A temp = A(this->a + aa.a, this->b + aa.b);  cout << temp.a << "b:" << temp.b << endl;  return temp; }

c++ 如何把this指针传入成员函数 像全局函数一样调用成员函数

测试这个功能的初衷是测试boost里面的bind boost::bind((&A::sum), &a, _1, _2) 上面的代码是我boost bind及多线程这篇博客里面的一行代码.我就想boost是怎么做到这样调用一个类的成员函数的.其实成员函数和全局函数无非就是差一个this指针参数.给传进去不就也可以调用了.然而并没有那么简单.看了boost的源码表示太长了.没怎么看懂 然后就自己写代码测试了一下.还用了汇编.. 代码参考  http://www.cppblog.com/woai

boost在lambda表达式中调用占位符参数的成员函数的方法

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数. 我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost.但是我用的

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this->b