ptr_fun,mem_fun,mem_fun_ref的使用

1、先得了解使仿函数可配置的方法

我们一般使用算法如下:

class TestForeach

{

void memFun();

};

vector<TestForeach> vsSTL;

void TestFun(TestForeach a)

{}

for_each(vsSTL.begin(), vsSTL.end(), TestFun);


如果TestFun不是全局函数就会编译不过了,想要使用memFun则无法使用了。解决办法如下

class TestSTL2: public std::unary_function<TestForeach, bool>

{

public:

// 有参数的写法

bool operator()(TestForeach& left)
{
left.memFun();
return true;
}

// 另外一种没有参数的写法,可能与本章节关系不大,只是两种写法都比较特殊,在此列举

// operator后面已经指定了返回类型了

operator bool ()

{

return true;

}

}

// 上面两个函数的调用方法

TestSLT2 a;

bool b1 = a(left);

bool b2 = a; // 不能写成a()


// 按照下面方式写就可以了,重载了()的实现,刚好要的参数就是vsTest。其实成员函数最后给编译器的也是全局函数了。

for_each(vsSTL.begin(),  vsSTL.end(), TestForeach2());


2、ptr_fun,mem_fun,mem_fun_ref的使用

按照如下方式就就可以了

for_each(vsSTL.begin(), vsSTL.end(), mem_fun_ref(&TestForeach::memFun));

实际上看mem_fun_ref的源码会发现,也是继承自unary_function,Ty就是类名,_Result就是返回值。

_Pmemfun是函数指针,就是传进来的memFun。最后重载()的调用return ((_Left.*_Pmemfun)());实际上就是如下调用

(*(vsTest.begin()).*&TestForeach::TestFun)();


template<class _Result,
class _Ty>
class mem_fun_ref_t
: public unary_function<_Ty, _Result>

{

explicit mem_fun_ref_t(_Result (_Ty::*_Pm)())
: _Pmemfun(_Pm)
{ // construct from pointer
}

_Result operator()(_Ty& _Left) const
{ // call function
return ((_Left.*_Pmemfun)());
}

private:
_Result (_Ty::*_Pmemfun)();// the member function pointer

}


是不是很神奇?看了好久才看懂的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
`std::ptr_fun`是C++标准库中的一个函数模板,位于头文件`<functional>`中。它可以将普通函数指针或函数对象转换为函数适配器,以便在算法中使用。 `std::ptr_fun`的定义如下: ```cpp template <typename Arg, typename Result> std::pointer_to_unary_function<Arg, Result> ptr_fun(Result (*f)(Arg)); ``` 参数`f`是一个普通函数指针,它指向一个接受类型为`Arg`的参数并返回类型为`Result`的函数。 `std::ptr_fun`函数模板返回一个`std::pointer_to_unary_function`类型的函数适配器对象,该对象可以将其参数应用于传入的函数指针。 以下是一个简单的示例,展示了如何使用`std::ptr_fun`将普通函数指针转换为函数适配器,并在算法中使用它: ```cpp #include <iostream> #include <algorithm> #include <vector> #include <functional> // 普通函数 bool isEven(int num) { return num % 2 == 0; } int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 将普通函数指针转换为函数适配器 std::function<bool(int)> isEvenAdapter = std::ptr_fun<int, bool>(isEven); // 使用函数适配器进行判断 auto it = std::find_if(numbers.begin(), numbers.end(), isEvenAdapter); if (it != numbers.end()) { std::cout << "找到了第一个偶数:" << *it << std::endl; } else { std::cout << "未找到偶数" << std::endl; } return 0; } ``` 输出结果: ``` 找到了第一个偶数:2 ``` 在上面的示例中,我们定义了一个名为`isEven`的普通函数,用于判断一个整数是否为偶数。然后,我们使用`std::ptr_fun`将普通函数指针`isEven`转换为函数适配器`isEvenAdapter`。最后,我们使用函数适配器`isEvenAdapter`在容器`numbers`中查找第一个满足条件的元素。最终找到了第一个偶数2并输出。 需要注意的是,C++11之后,可以直接使用lambda表达式或者函数对象代替`std::ptr_fun`来实现相同的功能,更加简洁方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值